黑马程序员技术交流社区

标题: 这个题做不出来 [打印本页]

作者: FINE    时间: 2015-1-3 21:54
标题: 这个题做不出来
金额转换,阿拉伯数字转换成中国传统形式。

例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
这个好像是黑马的入学测试题,我现在马上学就看泛型了。这个题考的是哪方面的知识点,到时我注意听!
作者: 魅影惊鸿    时间: 2015-1-3 22:33
这个貌似很繁琐。。
作者: jinghoujiayin    时间: 2015-1-3 22:39
期待自己通过努力可以能回答你的问题,一起加油
作者: Zoe19128    时间: 2015-1-3 22:41
考察的应该是String类
作者: 麦兜de篼    时间: 2015-1-3 23:18
我说下我的思路吧,不一定正确。我会首先将数字转化成位数相加的表示形式,例如1002=1*1000+0*100+0*10+2*1,然后设置一个数组跟位数相对应,1000对应仟,100对应佰,10对应拾,再设置一个数组对应个数,1对应壹,2对应贰,以此类推直到9对应玖,最后就是加入判断句来判断给的阿拉伯数字的情况,最后得到的结果是字符串。例如1002得到结果的过程就是,程序先得到1,对应壹,而它的位数对应的是仟,组合成壹仟,再接着读数,得到了百位数和十位数的0,在程序中加入对0的位置以及个数的判断得出结果零,最后得到了个位的2,对应贰,把得到的几个字符组合成一个字符串就是壹仟零贰。
作者: qig123    时间: 2015-1-3 23:19
这个用string类的知识可以解决,字符串和int类型的转换,具体实现起来还得费老大的尽
作者: 任我行_2014    时间: 2015-1-3 23:23
期待有大神出现,指导下
作者: z820661319    时间: 2015-1-4 11:57
这个网上应该有啊  可以找找看!

作者: 小敏儿    时间: 2015-1-4 12:04
希望有大神解决出来。
作者: xiao飞    时间: 2015-1-4 12:34
这道题 确实不好弄,一起学习
作者: hello_csu    时间: 2015-1-4 19:29
本帖最后由 hello_csu 于 2015-1-4 23:11 编辑

的确该题有点难度,主要考虑两个点:
1,怎么存数据处理。其中分为GroupLevel和UnitLevel(千,百,十,个)处理。
2,怎么删除多余的零,单位,该部分用到正则表达式。其代码如下:
  1. import java.util.*;
  2. import java.math.*;
  3. import java.util.regex.*;

  4. public class TestDemo {
  5.        
  6.         static final long CONST_DIV = 10000;
  7.     public static void main(String[] agrs) {
  8.             print(convertChineseFormat("101000001010"));
  9. }
  10. /**
  11.      * 金额转换,阿拉伯数字转换成中国传统形式。
  12.      * 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  13.      * @param o
  14.      */
  15.     public static String convertChineseFormat(String num) {
  16.         Character ch[] = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };  
  17.         Character money_unit[] ={'圆', '拾', '佰', '仟' };
  18.         Character big_money_unit[] ={ '万','億','兆' };  
  19.         String replaceregx[] = {"零圆","零拾","零圆","零佰","零仟","零万","零億","零兆"};
  20.         String targetstr[] = {"圆","拾","圆","佰","仟","万","億","兆"};
  21.         final int UNITLEVEL_MAX = 4;
  22.             BigInteger bignum= new BigInteger(num);
  23.             String format = null;
  24.         StringBuilder strbuilder = new StringBuilder();
  25.         int unitlevel = 0; //每次处理4位
  26.         int grouplevel = 0 ;//处理到哪有级别的四位
  27.         
  28.         while(!bignum.equals(BigInteger.ZERO)) {
  29.             int value = bignum.remainder(BigInteger.TEN).intValue();
  30.             if(unitlevel == UNITLEVEL_MAX) {
  31.                     strbuilder.append(big_money_unit[grouplevel]);
  32.                     unitlevel = 0;
  33.                     grouplevel++;
  34.             }else {
  35.                if(value != 0) {
  36.                        if((unitlevel == 0)&&(grouplevel==0)) {
  37.                                strbuilder.append('整');   
  38.                     }
  39.                        strbuilder.append(money_unit[unitlevel]);
  40.                }else {
  41.                        if((unitlevel == 0)&&(grouplevel==0)) {
  42.                                strbuilder.append('整');   
  43.                                strbuilder.append(money_unit[unitlevel]);
  44.                   }
  45.                }
  46.             }
  47.             strbuilder.append(ch[value]);
  48.             unitlevel++;
  49.             bignum = bignum.divide(BigInteger.TEN);
  50.                
  51.         }
  52.         
  53.         //pattern match to delete the 0.
  54.         format =strbuilder.reverse().toString();
  55.         format = format.replaceAll("(零)\\1+","零");
  56.       
  57.         //replace 零[unit]->[unit]
  58.         format = format.replaceAll("零([圆拾佰仟万億兆])","$1");
  59.         
  60.         format = format.replaceAll("([万億兆])([万億兆])+","$1\\零");
  61.   
  62.         return format;
  63.     }
  64.    
  65.     public static void print(Object e) {
  66.             System.out.println(e);
  67.     }
  68. }
复制代码


作者: 请叫我丶菜鸟    时间: 2015-1-4 20:15
import java.util.Scanner;

public class PrintNum {
   
   
    private static final char[] data = {'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
    private static final char[] units = {'圆','拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟'};
   
    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        while(true){
            Scanner scan = new Scanner(System.in);
            int lon = scan.nextInt();
            System.out.println(convert(lon));
            scan.close();
        }
    }

    private static String convert(int money) throws Exception{
        StringBuilder sb = new StringBuilder();
        int uint = 0;
        while(money!=0){
            sb.insert(0, units[uint++]);
            sb.insert(0, data[(int)(money%10)]);
            money = money / 10;
        }
        return sb.toString().replaceAll("零[仟佰拾]", "零").replaceAll("零+万", "万")
                .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
                .replaceAll("零+", "零").replaceAll("零圆", "圆");
    }

}



作者: 郝明明    时间: 2015-1-4 20:31
俺也来学习
作者: xc29417412    时间: 2015-1-4 20:49
一起学习
作者: hmyf150122    时间: 2015-1-4 21:22
就是数字转换为字符和取第几个字符进行处理
作者: zhiyi    时间: 2015-1-4 21:33
之前学进制转换时学的查表法,结合一点灵活的思想足以,还有使用StringBuilder的功能可以更专业
作者: yang2868648    时间: 2015-1-4 21:51
一起学习
作者: y1787257661    时间: 2015-1-4 21:51
赞一个!!
作者: Eagle    时间: 2015-1-5 13:52
我个人觉得,已经把所以的情况都考虑好了。不过,一个人的能力是有限的。不知道处理好没有。
如果看不清楚可以复制下来看。
http://blog.163.com/eagle_blog/blog/static/23992010920150515025996/#
有神马意见就在下面回复就好。
作者: xiao_jian    时间: 2015-1-5 14:02
学习一下 对我有帮助
作者: AnElse    时间: 2015-1-5 14:44
学习了!!!
作者: pure_dust    时间: 2015-1-5 15:10
挺厉害的!思路清晰
作者: Afridoce    时间: 2015-1-5 15:16
加油哈~~~~~~~~~~~~~~~~~~~
作者: LOVEQIAN    时间: 2015-1-5 15:53
学习下,不是很懂!
作者: Death、    时间: 2015-1-5 16:58
来学习一下
作者: gxb2459    时间: 2015-1-5 19:40
感谢分享
作者: 李票    时间: 2015-1-5 19:50
这个还真不知道,我也正在看这个呢




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