本帖最后由 王建亮 于 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("零+", "零");
- }
- }
复制代码
|
|