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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李大伟 于 2013-4-9 09:14 编辑

金额转换,阿拉伯数字转换成中国传统形式。
                 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整


这个题不会,找了一个 ,但是 输入长了 比如101000001010  就报错了
求大侠指点

public class Test{

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                //输出测试
                System.out.println(getString(405356221));
                System.out.println(getString(11000001010));
        }
        //定义两个数组 给数字做单位
        public static String[] cn={"仟","佰","拾","万","仟","佰","拾","亿","仟","佰","拾","万","仟","佰","拾","圆整"};
        public static String[] number={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        public static String getString(int n)
        {
         String money=""+n;
        //超过长度提醒
        if(money.length()>cn.length)
                throw new IllegalArgumentException("人民币超出计算范围,请重新输入!");
        //定义返回 字符串
        String str="";
        //使用for循环 匹配每个位数上的单位,以及大小写
        for(int i=0;i<money.length();i++)
        str+=number[Integer.parseInt(""+money.charAt(i))]+cn[cn.length-money.length()+i];
        return str;
        }

}


评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

33 个回复

倒序浏览
你是想输入任意数字都能转换成汉字吗?

这个题好玩 拿去试试  哈哈
回复 使用道具 举报
邵震 发表于 2013-4-6 13:47
你是想输入任意数字都能转换成汉字吗?

这个题好玩 拿去试试  哈哈

这个是考试题,最起码得能容纳那个例子吧
回复 使用道具 举报
能容纳这个例子的简单,但是想要真正做到无错转换任意位数的就有些难度了.转换的次数很多.你想要容纳这个位数的我给你一个参考,而且也很简单,但是要做到任一转换,你就自己想吧. 不写了,自己慢慢想吧,我自己的思路,把所有数值切成4等份,然后依次插入:千百十,然后再每个等份再插入万/亿/万亿,每个等份判断里再判断有多少个零.
  1. public static void main(String[] args) {
  2.                 Long num=101000001010L;
  3.                 System.out.println(change(num));
  4.         }
  5.         public static String change(Long num){//long的包装类","因为包装类可以转换成字符串","而Long的范围也可以容纳那个数值
  6.                 String[] list={"零","一","二","三","四","五","六","七","八","九"};
  7. //                String[] nuit
  8.                 char[] nums=num.toString().toCharArray();//数值在ASCII码.
  9.                 StringBuilder numBuilder=new StringBuilder();
  10.                 for(char c:nums)
  11.                         numBuilder.append(list[c-48]);
  12.                 return numBuilder.toString();
  13.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报 1 0
public static String[] cn={"", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};

当超过8位,也就是在亿以上的时候,又回来循环赋值

当你在各个单位前面赋上零的时候,要处理,将“零拾”,“零佰”等等用零替换,
最后处理连续出现的“零”为一个“零”
……
需要源代码可以给你一个

评分

参与人数 2技术分 +2 收起 理由
滔哥 + 1 多送你1分做为论坛参与奖。
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
你这是入学测试压轴题呀 ,胆挺肥呀
回复 使用道具 举报
package com.itheima;

/**
* 第10题: 金额转换,阿拉伯数字转换成中国传统形式。
*例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
*
*@author 陈宝峰
*
*步骤:
*1.创建一个转换的方法converNumber(long number)
*2.将阿拉伯形式转换成中国传统形式
*3.去零操作
*4.正则表达式替换操作
*/
public class Test10 {
        public static void main(String[] args){
                //测试
                System.out.println(convertNumber(3500908));
                System.out.println(convertNumber(101000001010L));
        }
        public static String convertNumber(long number){
                //定义字符数组存储中国数字写法格式
                final char[] chineseNumber = new char[]
                { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
                //定义字符数组存储中国数字的单位
                final char[] units = new char[]
                { '圆', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'};
                //定义一个字符串缓冲区对字符进行存储
                StringBuilder sb = new StringBuilder();
                int index=0;
                long lastNumber = 0;
                while(number!=0){
                        lastNumber = number%10;
                        sb.insert(0,units[index++]);
                        sb.insert(0,chineseNumber[(int) lastNumber]);
                        number=number/10;
                }
                //去零操作,通过正则表达式
                return sb.toString().replaceAll("零[拾佰仟]","零").replaceAll("零+亿","亿").replaceAll("零{4}万","零").
                replaceAll("零+万","万").replaceAll("零+圆","圆").replaceAll("零+","零")+"整";
        }

}
我感觉我这个很简练,各位也挑挑毛病吧

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1 注意:请使用插入代码

查看全部评分

回复 使用道具 举报 3 0
我手心里的宝 发表于 2013-4-8 09:03
package com.itheima;

/**

我这个 真心不会啊,这个是压轴的啊,我说这么难呢
回复 使用道具 举报
王川 发表于 2013-4-8 01:34
public static String[] cn={"", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};

当超过8位,也就是在 ...

需要啊 ,看看,谢谢了
回复 使用道具 举报
真胆肥啊,这个也敢拿出来问
回复 使用道具 举报
王海龙2013 发表于 2013-4-8 14:23
真胆肥啊,这个也敢拿出来问

这个没什么吧,我确实不会,不会就问问,与其去百度里边问陌生人,在论坛里边大家都讨论讨论不是更好吗,我觉得学校也应该支持这种公开讨论吧,
回复 使用道具 举报 1 1
李大伟 发表于 2013-4-8 14:16
需要啊 ,看看,谢谢了

public class Test10 {
        public static void main(String[] args) {
                /*由于直接用整数表示要转换的大数不好表示,所以,将式子表示成字符串型*/
                String moneyString = "101000000010";
               
                System.out.println(transform(moneyString));
        }

        /**
         *
         * @param moneyString 传入的待转换字符串
         * @return 转换好的字符串
         */
        public static String transform(String moneyString) {
                /* 定义中文大写的数组 */
                String[] chineseUpcase = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌",
                                "玖" };

                /* 定义换算单位 */
                String[] unit = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };

                StringBuilder builder = new StringBuilder();

                /**
                 * 依次替换数字为大写,并给每位赋一个单位
                 */
                for (int i = 0; i < moneyString.length(); i++) {
                        /*
                         * 按照出现的数字,依次替换成大写汉字,在ASCII码中,数字0对应的字符编码是48,
                         * 所以,得到了字符,就应该减去48以换算成相应的数字值
                         */
                        builder.append(chineseUpcase[moneyString.charAt(i) - 48]);
                }

                int pointer = 1;
                for (int j = moneyString.length() - 1; j > 0; j--) {
                        /* 从最低位开始依次在每位后面加上各自代表的位数,拾位,佰位,仟位等 */
                        builder.insert(j, unit[pointer++]);
                        /* 在亿位之后又重新开始循环 */
                        if (pointer == 9)
                                pointer = 1;
                }

                /**
                 * 对出现的零和单位的特殊情况做处理
                 *
                 *replace(int start,int end,String str)
                                        start - The beginning index, inclusive.
                                        end - The ending index, exclusive.
                                        str - String that will replace previous contents.
                 */
                /* 当十位为零时,用"零"代替"零拾" */
                while (builder.indexOf("零拾") != -1) {
                        builder.replace(builder.indexOf("零拾"), builder.indexOf("零拾") + 2, "零");
                }

                /* 当百位为零时 */
                while (builder.indexOf("零佰") != -1) {
                        builder.replace(builder.indexOf("零佰"), builder.indexOf("零佰") + 2, "零");
                }

                /* 仟位为零 */
                while (builder.indexOf("零仟") != -1) {
                        builder.replace(builder.indexOf("零仟"), builder.indexOf("零仟") + 2, "零");
                }

                /* 万位为零,需要保留“万”*/
                while (builder.indexOf("零万") != -1) {
                        builder.replace(builder.indexOf("零万"), builder.indexOf("零万") + 2, "万");
                }

                /* 亿位为零 */
                while (builder.indexOf("零亿") != -1) { // 同上
                        builder.replace(builder.indexOf("零亿"), builder.indexOf("零亿") + 2, "亿");
                }

                /********* 特殊情况,当有亿和万碰到一起的时候,如:100002345 **********/
                while (builder.indexOf("亿万") != -1) {
                        builder.replace(builder.indexOf("亿万"), builder.indexOf("亿万") + 2, "亿零");
                }
               
                /* 有连续的零时,保留一个零 */
                while (builder.indexOf("零零") != -1) {
                        builder.replace(builder.indexOf("零零"), builder.indexOf("零零") + 2, "零");
                }

                /* 当结尾为零时,不显示,经过上面对“零零”的处理,只可能出现一个零 */
                while (builder.lastIndexOf("零") == builder.length() - 1) {
                        /*这里的参数,end,最好不要写成builder.length,防止方法移动后,后面添加的东西也被删除了*/
                        builder.delete(builder.lastIndexOf("零"), builder.lastIndexOf("零") + 1);
                }
                builder.append("圆整");
               
                return builder.toString();
        }
}

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报

学习了。。。。。。。。。
回复 使用道具 举报
正则表达式不简单啊
回复 使用道具 举报

不错啊:)。。。。。。。。。。
回复 使用道具 举报

还是正则表达式强大。
回复 使用道具 举报
看着有点懵!
回复 使用道具 举报
看蒙了 {:3_49:}
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马