黑马程序员技术交流社区

标题: 忘各位大神指出金额转换程序中的bug [打印本页]

作者: 我手心里的宝    时间: 2013-4-16 13:49
标题: 忘各位大神指出金额转换程序中的bug
import java.util.Scanner;
public class MoneyTrant
{
        public static void main(String[] args){
                Scanner in = new Scanner(System.in);
                while(true){
                        System.out.println("请输入你要转换的货币金额");
                        String money = in.next();
                        if(money.equalsIgnoreCase("over"))
                                break;
                        long moneyNumber = Long.parseLong(money);
                        trant(moneyNumber);
                }
        }
        public static void trant(Long moneyNumber){
                char[] chineseNumber = new char[]{'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
                char[] units = new char[]{'元','拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟'};
                int index = 0;
                long lastNumber = 0;
                StringBuilder sb = new StringBuilder();
                while(moneyNumber !=0){
                        lastNumber = moneyNumber%10;
                        sb.insert(0,units[index++]);
                        sb.insert(0,chineseNumber[(int)lastNumber]);

                        moneyNumber = moneyNumber/10;
                }
                String money = sb.toString().replaceAll("零[拾佰仟]","零").replaceAll("零+亿","亿").replaceAll("零+万","零").
                        replaceAll("零+元","元");
                System.out.println(money);
        }
}
各位大神,代码可以复制运行就可以了,求指出其中的bug,有问题,我测试了,想的不多,还望多多指正
版主,帖子不要那么快分类好吗?我是想看看各位给的程序漏洞
作者: 我手心里的宝    时间: 2013-4-16 13:51
金额转换,阿拉伯数字转换成中国传统形式。
例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
----------------------
这是原题目


作者: _王涛    时间: 2013-4-16 14:17
下面是我的修改::
import java.util.Scanner;
public class MoneyTrant
{
        public static void main(String[] args){
                Scanner in = new Scanner(System.in);
                while(true){
                        System.out.println("请输入你要转换的货币金额");
                        String money = in.next();
                        if(money.equalsIgnoreCase("over"))
                                break;   
                        try{                       
                            long moneyNumber = Long.parseLong(money);
                            trant(moneyNumber);
                        }catch(Exception e){
                          throw new RuntimeException("非法数字");
                        }     
                }
        }
        public static void trant(Long moneyNumber){
                char[] chineseNumber = new char[]{'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
                char[] units = new char[]{'元','拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟'};
                int index = 0;
                long lastNumber = 0;
                StringBuilder sb = new StringBuilder();
                while(moneyNumber !=0){
                        lastNumber = moneyNumber%10;
                        sb.insert(0,units[index++]);
                        sb.insert(0,chineseNumber[(int)lastNumber]);
                        moneyNumber = moneyNumber/10;
                }
                String money = sb.toString().replaceAll("零[拾佰仟]","零").replaceAll("零+亿","亿").replaceAll("零+万","零").
                        replaceAll("零+元","元");
                System.out.println(money);
        }
}
我认为需要判断下是否是数字类型,万一输入非法字符的情况呢,所以加一个异常捕获最佳。。。

作者: 郭东生    时间: 2013-4-16 14:57
小数不可以转换,

Exception in thread "main" java.lang.NumberFormatException: For input string: "2
5.3"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:65)
        at java.lang.Long.parseLong(Long.java:441)
        at java.lang.Long.parseLong(Long.java:483)
        at MoneyTrant.main(MoneyTrant.java:12)
作者: 郭东生    时间: 2013-4-16 15:01
这个数转换结果不正确

1000000205
壹拾亿零零贰佰零伍元
作者: 陈圳    时间: 2013-4-16 15:17
这道题我解了,越到最后发现麻烦越多.后来我想明白了必须要解决这几点.
第一:零的处理,中间多个零,或尾部多个.
第二:插入金额单元问题.如果有中间有多个零,超过4个,万是不需要的.
第三:关于千百十,万亿十亿,这样的单位,怎么插才不会错.
真不能用正则缺什么替换什么,只有全部系统的把所有问题全解决,这道题才行.
后起我想了一个办法,把一个字符给切成四个数字每段,再分别处理.
1010
0000
1010
然后每个分别插入:千百十,再判断每个小字符串尾部有几个0,
有0就不用插单元,
再每个小字符串插万亿十万亿.
如果两个字符串中间有开头末尾都是0,那么单元还要往前移再插!
shit!
后来,我做出来了,一口气写了我认为可能出错的所有示例,!
如果再出错,我给你跪了!

作者: 我手心里的宝    时间: 2013-4-17 08:55
非常感谢大家的提问
作者: 黄玉昆    时间: 2013-4-17 08:57
如果没有问题了,请将帖子分类 改为“已解决”,谢谢




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