A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima;

import static org.junit.Assert.assertEquals;  

import java.math.BigInteger;  

import org.junit.Test;  
/**
*
*第十题  10、 金额转换,阿拉伯数字转换成中国传统形式。

例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
* @author Alex Zhuang
*
*/  

public class Test10 {

       
       
          


static class MoneyConvert {  

    private static final char[] CHINESE_NUM = new char[] { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };  

    private static final char[] CHINESE_MONEY_UNIT = new char[] { '圆', '拾', '佰', '仟' };  

    private static final String[] CHINESE_MONEY_BIG_UNIT = new String[] { "万", "億" , "万" , "兆" };  

    @Test  
    public void test(){  
        assertEquals("柒圆",convertToChinese("7"));  
        assertEquals("壹仟零壹拾億壹仟零壹拾圆整",convertToChinese("101000001010"));  
        assertEquals("壹仟贰佰叁拾肆兆伍仟陆佰柒拾捌万玖仟零壹拾贰億叁仟肆佰伍拾陆万柒仟捌佰玖拾圆整",convertToChinese("12345678901234567890"));  
        assertEquals("壹仟兆圆整",convertToChinese("10000000000000000000"));  
        assertEquals("贰万叁仟肆佰玖拾贰億捌仟柒佰叁拾肆万玖仟捌佰叁拾肆圆",convertToChinese("2349287349834"));  
    }  

    public static String convertToChinese(String moneyStr){  
        if(moneyStr.length()<=20){  
            BigInteger money = new BigInteger(moneyStr);  
            StringBuilder sb = new StringBuilder();  
            int unitLevel=0;  
            int bigUnitLevel=0;  
            while(money.compareTo(BigInteger.ZERO)>0){  
                /*将输入金额对10取余操作*/  
                int i = money.remainder(BigInteger.TEN).intValue();  
                if(unitLevel==4){  
                    sb.insert(0, CHINESE_MONEY_BIG_UNIT[bigUnitLevel]);  
                    bigUnitLevel++;  
                    unitLevel=0;  
                }else{  
                    /*当单位对应的数字不为零时才输出该单位*/  
                    if(i!=0){  
                        sb.insert(0, CHINESE_MONEY_UNIT[unitLevel]);  
                    /*判断该数字是否为个位数,如是则在字符数串后加圆*/  
                    }else if(bigUnitLevel==0&&unitLevel==0){  
                        sb.insert(0, CHINESE_MONEY_UNIT[unitLevel]);  
                        /*如果个位数的数字为零,则在最后面加字符'整' */  
                        if(i==0){  
                            sb.append('整');  
                        }  
                    }  
                }  
                sb.insert(0, CHINESE_NUM[i]);  
                money=money.divide(BigInteger.TEN);  
                unitLevel++;  
            }  
            String str = sb.toString();  
            for(int i=0;i<4;i++){  
                str=str.replaceAll("零兆", "兆");  
                str=str.replaceAll("零億", "億");  
                str=str.replaceAll("零万", "万");  
                str=str.replaceAll("零圆", "圆");  
            }  
            str=str.replace("兆万億", "兆");  
            str=str.replace("億万", "億");  
            str=str.replace("兆万", "兆");  
            return str;  
        }else{  
            return "输入金额过大,已达到或超过1万兆,无法转换";  
        }  
    }
    public static void main(String[] args){  
        System.out.println("7="+convertToChinese("7"));  
        System.out.println("101000001010="+convertToChinese("101000001010"));  
        System.out.println("10000000000000000000="+convertToChinese("10000000000000000000"));  
        System.out.println("12345678901234567890="+convertToChinese("12345678901234567890"));  
        System.out.println("2349287349834="+convertToChinese("2349287349834"));  

    }
}




}



评分

参与人数 2技术分 +1 黑马币 +4 收起 理由
chenyue1111 + 4 很给力!
杨千里 + 1

查看全部评分

7 个回复

倒序浏览
{:soso_e132:}
回复 使用道具 举报
一起学习啊
回复 使用道具 举报
天机不可泄露啊~~
回复 使用道具 举报
你猜猜看哦
回复 使用道具 举报
这种题不适合发到论坛吧?
回复 使用道具 举报
package com.itheima;
/*10、 金额转换,阿拉伯数字转换成中国传统形式。

例如:1010 0000 1010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整*/

public class Test10 {
        //定义两个表。用查表法做
        private static final char[] data = new char[] { '零', '壹', '贰', '叁', '肆',
                        '伍', '陆', '柒', '捌', '玖' };

        private static final char[] units = new char[] {
                '元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'
        };

        public static void main(String[] args) {
                System.out.println(convert(101000001010L));
        }

        public static String convert(long money)

        {
                //定义一个缓冲区
                StringBuffer sbf = new StringBuffer();

                int unit = 0;
                //循环的功能是取出每一个位置上的数字:取余十,除以十。用查表法来添加对应位置的中文字符
                //StringBuffer缓冲区中的内容[壹, 仟, 零, 佰, 壹, 拾, 零, 亿, 零, 仟, 壹, 佰, 零, 拾, 壹, 万, 壹, 仟, 零, 佰, 壹, 拾, 零, 元, ]
                while (money != 0)

                {
                        //当前位置插入元,拾,佰....
                        sbf.insert(0, units[unit++]);

                        long number = money % 10;
                        //当前插入位置零, 壹, 贰.....
                        sbf.insert(0, data[(int) number]);
                        System.out.println();
                        money /= 10;

                }
                //用正则表达式来改变不应该有的零.
                return sbf.toString().replaceAll("零[拾佰仟]", "零").replaceAll("零+亿", "亿")
                                .replaceAll("零+万", "零").replaceAll("零+元", "圆整")
                                .replaceAll("零+", "零");

        }

}
回复 使用道具 举报
马纵驰 发表于 2012-12-3 21:52
package com.itheima;
/*10、 金额转换,阿拉伯数字转换成中国传统形式。

这是怎么回事

未1命名.jpg (207.85 KB, 下载次数: 80)

未1命名.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马