黑马程序员技术交流社区

标题: 金额转换,阿拉伯数字转换成中国传统形式。 [打印本页]

作者: xiaoxiaoyuxie    时间: 2017-3-8 23:47
标题: 金额转换,阿拉伯数字转换成中国传统形式。
我是来贴代码赚积分的 ,刚开始思路不对,用了好多循环,最后简化成这样,递归真是个好东西

public static void main (String[] args){
    long number=2300340099121419870L; //一个超长的数字,取值范围为long类型的最大值
    String value= transform("", number);
    System.out.print(value);
}private static String transform(String word, long number){
    String tempStr=""+number;
    int len=tempStr.length();               //获取数字长度
    if (len==1){
        word+=getChineseWord(number);       //如果剩个位数那么直接转换,并结束递归
        return word;
    }
    long baseNum= getBaseNum(len);          //根据数字长度获取元单位(兆,亿,万等)
    long single= (number/baseNum);          //查看有多少个元单位
    if (single>10&&single<baseNum){
        word+=transform("",single);         //个位数以上的元单位递归处理
    }else
    {
        word+=getChineseWord(single);       //个位数的元单位转换后,继续执行
    }
    word=checkZero(word);                   //避免 零万 零零万等情况出现
    word+=getChineseWord(baseNum);          //拼接汉字元单位
    number%=baseNum;                        //去掉已转换的顶位,继续转换从元单位开始以下的数字
    if (number/(baseNum/10)==0){            //如果下一位是"0",那么拼接"零"字符
        if (len-1==1) return word;          //拼接中如果下一位已经是最后一位,那么中断拼接,直接返回.
        word+=getChineseWord(0);
    }
    return transform(word,number);          //递归执行,直到len==1结束.
}private static String getChineseWord(long number){
    if (number==10E15){//因switch 判断条件不能为long值,所以单独判断
        return "兆";
    }
    switch ((int)number){
        case 0 :
            return "零";
        case 1:
            return "壹";
        case 2:
            return "贰";
        case 3:
            return "仨";
        case 4:
            return "肆";
        case 5:
            return "伍";
        case 6:
            return "陆";
        case 7:
            return "柒";
        case 8:
            return "捌";
        case 9:
            return "玖";
        case 10:
            return "拾";
        case 100:
            return "佰";
        case 1000:
            return "仟";
        case 10000:
            return "万";
        case 100000000:
            return "亿";
    }
    return "";
}
private static Long getBaseNum(int len){
    long num=1L;
    if (len>=17){       //兆级别 ,long类型最长为19位,所以兆级别足矣
        len=17;
    }else if (len>=9){  //亿级别
        len=9;
    }else if (len>=5){  //万级别
        len=5;
    }
    for (int i = 1; i < len; i++) {
        num*=10;
    }
    return num;
}

private static String checkZero(String word){
    if (word.substring(word.length()-1).equals("零")){
        word=word.substring(0,word.length()-1);
        return checkZero(word);
    }else
    {
        return word;
    }
}

作者: guoqibing    时间: 2017-3-9 00:41
看不懂

作者: mrwalker    时间: 2017-3-10 09:13
我也表示还不能看懂




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