黑马程序员技术交流社区
标题:
金钱转换
[打印本页]
作者:
王建亮
时间:
2015-6-23 21:01
标题:
金钱转换
本帖最后由 王建亮 于 2015-6-23 21:22 编辑
package com.itheima;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 题目: 金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
* 思路: 将阿拉伯数字从最低位开始每四个数字为一组进行分组,然后通过一系列的运算以此在每一位后面加上正确的单位 每一组的后面再加上如 "圆整", "万",
* "亿", "兆" 这样的单位,最后将这些结果拼成到一个StringBuilder中 再对一些小的细节进行正则表达式的替换,最终打印正确的中国传统形式。
* 注:不考虑小数部分
*
* @author wjl
*
*/
public class Test10 {
public static void main(String[] args) {
// 定义一个输入流来读取从控制台输入的阿拉伯数字
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String source = null;// 定义一个String变量来接受从控制台读取的数据
try {
System.out.print("请输入合法的阿拉伯数字:");
// 使用while循环可以无限输入进行转换,当输入over的时候停止工作(无视大小写)
while (!"over".equalsIgnoreCase(source = in.readLine())) {
// 对source的合法性校验
// 必须是数字,不能是0开头,长度是1-16位
// 声明一个正则表达式
String moneyReg = "[1-9][0-9]{0,15}";
if (!source.matches(moneyReg)) {// 如果校验未通过
System.out.println("您输入了非法的数字。");
} else {
System.out.println(source + "对应的中国传统形式是:"
+ changeMoneyToChinese(source));
}
System.out.print("请输入合法的阿拉伯数字:");
}
} catch (IOException e) {
System.out.println("系统故障。。");
} finally {
// 关闭流对象
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* @param source
* 一个小于16位的阿拉伯数字形式的字符串
* @return 返回中国传统形式
*/
public static String changeMoneyToChinese(String source) {
// 定义一个汉语的0到9的数组
String[] num = new String[] { "零", "壹", "貳", "叁", "肆", "伍", "陆", "柒",
"捌", "玖" };
// 定义一个在每四位中会用到的单位
String[] unit = new String[] { "拾", "佰", "仟" };
// 定义一个在每组的后缀单位
String[] bigUnit = new String[] { "圆整", "万", "亿", "兆" };
// 最终结果,使用StringBuilder
StringBuilder result = new StringBuilder("");
// 每组的后缀单位bigUnit的当前下标值
int nowBigUnit = 0;
// 对源数据进行for循环
for (int i = source.length(); i >= 0; i -= 4) {
// 从最低位开始每4位为一组,剩下的不足4个的为一组
String money = source.substring(i < 4 ? 0 : i - 4, i);
// 对四位进行处理
StringBuilder sb = new StringBuilder();
// 每一位的后缀单位unit的当前下标值,默认为-1
int nowUnit = -1;
// 对获取到的每组四位数字通过for循环进行转换
for (int index = money.length() - 1; index >= 0; index--) {
// 因为unit只有三个单位,每组的最低位暂时不需要单位
if (index != money.length() - 1)
nowUnit++;
// 获取遍历到的单个字符
char ch = money.charAt(index);
if (ch != '0') {// 如果该字符不是0
// 防止第一位就是一个非零的情况,如果是其他位就获取相对应的单位
if (index != money.length() - 1)
sb.insert(0, unit[nowUnit]);
// 再将对应的中文插入StringBuilder的第一位
sb.insert(0, num[Integer.parseInt(ch + "")]);
} else {// 当ch为0的时候
// 声明一个char来存储在该循环中前一个字符
char preCh = ' ';
if (index <= money.length() - 2) {
preCh = money.charAt(index + 1);
}
if (preCh == '0') {// 如果前一个也是0那么只需要存储一个零就好了,然后接着走for循环
continue;
} else {// 如果仅仅是该位为0就插入零
sb.insert(0, num[Integer.parseInt(ch + "")]);
}
}
}
// 如果sb的值是以零结尾的,同时sb的值并不是零,那么就将最后位的零删除
if (sb.toString().endsWith("零")) {
if (!sb.toString().equals("零")) {
sb.delete(sb.length() - 1, sb.length());
}
}
// 如果通过上面的操作得到的是一个长度大于0,并且值不为零的StringBuilder,就在该组的后面接上后缀单位
if (sb.length() > 0 && !sb.toString().equals("零")) {
sb.append(bigUnit[nowBigUnit]);
}
// 不管情况如何,每组的后缀单位必须要加一
nowBigUnit++;
// 将每组的最终结果拼接到代表程序最终结果的result StringBuilder类型
result.insert(0, sb);
}
// 如果最终结果是以 多个零结尾 则替换成 空 然后将中间部位的多个零替换成一个零就可以得到中国传统形式了
return result.toString().replaceAll("零+$", "").replaceAll("零+", "零");
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2