楼主,我贴一下我的代码吧。比你的长的多了。
可以满分通过的哟。嘿嘿
- package com.itheima;
- /**
- * 10、 金额转换,阿拉伯数字转换成中国传统形式。
- * 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
- *
- * 思路:
- *
- * 1、把小数点前后分开,分别处理。
- *
- * 2、将切割后的字符串金额转换为字符数组
- *
- * 3、将字符转成整数型。
- *
- * 4、用转换的整数去查表。
- *
- * 5、每获取一个整数的大写形式,就在后面跟上相应的单位,如拾、佰、仟、万等单位。存储在缓冲区中。
- *
- * 6、再将零拾等替换成零。去除多余零等操作。
- *
- * 7、将替换完毕后的字符串返回
- *
- *
- * 大写中零的规则:
- *
- * 阿拉伯金额数字万位和元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”但千位、角位不是“0”时,
- * 中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1680.32应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分。
- * 又如¥107000.53应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。
- */
- public class Test10 {
- public static void main(String[] args) {
-
- //将要被转换的金额
- String moneyNum = "101000001010";
- //转换金额
- String str = moneyCast(moneyNum);
- //打印转换后的金额
- System.out.println("¥"+str);
- }
- // 将阿拉伯金额转成大写的金额,最大转换金额单位:万亿,最小:毫
- public static String moneyCast(String moneyStr) {
-
- //如果金额为空,返回零圆整
- if(moneyStr==null || moneyStr.equals(""))
- throw new RuntimeException("金额为空!");
-
- // 用的是查表法,这是0-9的大写表格。
- String[] bigNum = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
- // 这是相应位数后面的单位
- String[] unit = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
- "佰", "仟", "万" };
- // 确定金额的正负,并将前面的负号去掉
- String head = "";
- if (moneyStr.startsWith("-")) {
- head = "负";
- moneyStr = moneyStr.replace("-", "");
- }
- // 将整数部分和小数部分切割分开进行大写转换
- String[] temp = moneyStr.split("\\.");
- // =====================================================
- /**
- * 整数部分转换
- */
- //将整数部分的0去掉
- while(temp[0].startsWith("0")) {
- temp[0] = temp[0].replaceFirst("0", "");
- }
-
- // 获取前面整数部分的整数形式的数组
- int[] startMoney = strToInt(temp[0]);
- // 当输入的金额超出转换能力时,直接抛出错误提示。不再进行转换
- if (startMoney.length > unit.length)
- throw new ArrayIndexOutOfBoundsException("位数超出!");
- // 定义一个整数,作为查找位数后面的单位的指针
- int unitLeng = startMoney.length;
- // 缓冲区用于装查表后的结果。
- StringBuilder sb = new StringBuilder();
-
- // 遍历前面整数,查表,添加到缓冲区
- for (int i = 0; i < startMoney.length; i++) {
- // 添加大写格式到缓冲区
- sb.append(bigNum[startMoney[i]]);
- // 添加单位到缓冲区
- sb.append(unit[--unitLeng]);
- }
- // 将缓冲区的字符串取出
- String bigMoney = sb.toString();
- // 对字符串进行去除多余文字的处理。如零佰、零仟、多个零等等。
- bigMoney = bigMoney.replaceAll("零[拾佰仟]", "零").replaceAll("零+万", "万")
- .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
- .replaceAll("零+圆", "圆").replaceAll("零+", "零");
- //如果整数部分为零,就去掉所有整数部分的字符串
- if(bigMoney.matches("[万亿]?(万亿)?圆"))
- bigMoney = "";
-
-
- // =========================================================
-
- // 如果没有小数,并且整数部分为零,直接返回零圆整
- if (temp.length == 1 && bigMoney.equals(""))
- return "零圆整";
- // 如果没有小数,并且整数部分不为零,直接返回整数部分
- else if(temp.length == 1)
- return head + bigMoney + "整";
- /**
- * 小数部分转换
- */
- // 小数部分的单位表格
- String[] smallUnit = { "角", "分" };//可扩展 "厘", "毫"
- // 获取小数部分的整数形式的数组
- int[] endMoney = strToInt(temp[1]);
- // 判断小数部分的位数是否超出范围
- if (endMoney.length > smallUnit.length) {
- throw new ArrayIndexOutOfBoundsException("小数点后面的位数超过了4位!");
- }
- // 创建缓冲区,用于存储小数部分的大写形式
- StringBuilder sbd = new StringBuilder();
- // 遍历查表将数字与单位添加进缓冲区。
- for (int x = 0; x < endMoney.length; x++) {
- // 添加数字的大写格式
- sbd.append(bigNum[endMoney[x]]);
- // 添加小数的单位
- sbd.append(smallUnit[x]);
- }
- // 将缓冲区数据转为字符串,方便进行替换操作
- String smallStr = sbd.toString();
- // 去掉多余零和其他多余的字符。
- smallStr = smallStr.replaceAll("零[角分]", "").replaceAll("零+", "零");
- // 整数部分为零的情况
- if (bigMoney.equals("")) {
- //小数部分为零,返回零圆整
- if(smallStr.equals(""))
- return "零圆整";
- //小数部分不为零,直接返回符号和小数部分
- else
- return head + smallStr;
-
- }
- // 如果小数部分为零,就将整数部分后面加上整字符。
- if (smallStr.equals(""))
- bigMoney = bigMoney + "整";
- // 都不为零就将整数部分加上小数部分
- else {
- //将个位为零的情况在圆后面加上零。
- if(bigMoney.matches(".+[拾佰仟万亿]圆"))
- bigMoney = bigMoney + "零";
- bigMoney = bigMoney + smallStr;
- }
- // 返回符号和大写金额。
- return head + bigMoney;
- }
- // 将字符串转为整数数组
- public static int[] strToInt(String temp) {
- // 将字符串转为字符数组
- char[] chs = temp.toCharArray();
- // 新建int数组用于装金额的单个整数形式
- int[] arr = new int[chs.length];
- // 遍历字符数组
- for (int a = 0; a < chs.length; a++) {
- // 将字符转为字符串
- String ch = Character.toString(chs[a]);
- // 将字符串转为int类型
- try {
- int i = Integer.parseInt(ch);
- // 存入int类型的数组
- arr[a] = i;
- // 处理用户输入错误字符的情况
- } catch (NumberFormatException e) {
- throw new NumberFormatException("输入的金额格式有误!");
- }
- }
- // 将整数形式的数组返回
- return arr;
- }
- }
复制代码 |