黑马程序员技术交流社区

标题: 101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整 [打印本页]

作者: tfy    时间: 2012-12-2 12:37
标题: 101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
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"));  

    }
}




}




作者: pphdsny3    时间: 2012-12-2 12:50
{:soso_e132:}
作者: tfy    时间: 2012-12-2 13:19
一起学习啊
作者: 葬天    时间: 2012-12-2 13:23
天机不可泄露啊~~
作者: tfy    时间: 2012-12-2 13:28
你猜猜看哦
作者: 宫明星    时间: 2012-12-2 21:20
这种题不适合发到论坛吧?
作者: 马纵驰    时间: 2012-12-3 21:52
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-5 04:07
马纵驰 发表于 2012-12-3 21:52
package com.itheima;
/*10、 金额转换,阿拉伯数字转换成中国传统形式。

这是怎么回事

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

未1命名.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2