`
yznxing
  • 浏览: 367128 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【无聊的笔记】将数字转换为中文读法

    博客分类:
  • java
阅读更多

将阿拉伯数字的数变成我们常用的中文读法,

 

比如说: 1234,读作1千2百3十4,反正就跟中文读的一样就对了。

 

 

分析过程其实是这个题目最重要的,但是我实在不想写那么多文字了。

 

这里纯粹为了记录代码,以后再补上分析过程和思路。

 

 

代码记录:

 

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author goliang
 * @version 创建时间:2011-6-5 下午01:29:32 类说明
 */

public class Num2String {

    /**
     * 处理0,1,2.。9的中文读法的
     */
    private static Map<Integer, String> numberStringMap = new HashMap<Integer, String>();

    /**
     * 10进制的读法
     */
    private static Map<Integer, String> base10StringMap = new HashMap<Integer, String>();

    static {
        numberStringMap.put(0, "零");
        numberStringMap.put(1, "壹");
        numberStringMap.put(2, "贰");
        numberStringMap.put(3, "叁");
        numberStringMap.put(4, "肆");
        numberStringMap.put(5, "伍");
        numberStringMap.put(6, "陆");
        numberStringMap.put(7, "柒");
        numberStringMap.put(8, "捌");
        numberStringMap.put(9, "玖");

        base10StringMap.put(1, "");
        base10StringMap.put(2, "十");
        base10StringMap.put(3, "百");
        base10StringMap.put(4, "千");
        base10StringMap.put(5, "万");

    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        int a[] = { 2000042, 1298302000, 1003, 1030, 1000, 20000000 };
        for (int i = 0; i < a.length; i++) {
            readChinese(a[i]);
        }

    }

    private static void readChinese(int a) {
        String intString = a + "";
        char ichar[] = intString.toCharArray();

        char icharrevert[] = revertCharArray(ichar);

        int i = 0;
        String result = "";
        while (i < icharrevert.length) {
            char[] icharsplit = Arrays.copyOfRange(icharrevert, i, i + 4 < icharrevert.length ? i + 4
                    : icharrevert.length);
            result = processSplitedNumber(icharsplit, (i + 1) / 4) + result;
            i = i + 4;
        }

        System.out.println("原数字为:"+a+"切换后的读法为:"+result);
    }

    private static char[] revertCharArray(char[] ichar) {
        char icharNew[] = new char[ichar.length];
        /**
         * 将得到的数组倒排,这样做原因是因为读的时候从前往后读, 位数前面的高
         */
        for (int i = ichar.length - 1, j = 0; i >= 0 && j < ichar.length; i--, j++) {
            icharNew[j] = ichar[i];
        }

        return icharNew;
    }

    private static String processSplitedNumber(char[] num, int time) {
        StringBuffer sb = new StringBuffer();

        for (int i = num.length - 1; i >= 0; i--) {

            //            sb.append(num[i]);
            if (num[i] == '0') {

                /**
                 * 当前数字是0.并且是最后一位,直接不读
                 */
                if (i == 0) {
                    continue;
                }

                /**
                 * 当前数字是0,下一个数字不是0,补一个0上去读
                 */
                if (num[i - 1] != '0') {
                    sb.append(numberStringMap.get(Integer.valueOf(num[i] + "")));
                } else {
                    continue;
                }

            } else {
                /**
                 * 如果当前位数不是0,那就正常的读出数字和位
                 */
                sb.append(numberStringMap.get(Integer.valueOf(num[i] + "")));
                sb.append(base10StringMap.get(i + 1));
            }
        }

        if (time == 0) {
        } else if (time == 1) {
            sb.append("万");
        } else if (time == 2) {
            sb.append("亿");
        }
        return sb.toString();
    }
}
最后的输出结果:
原数字为:2000042切换后的读法为:贰百万零肆十贰
原数字为:1298302000切换后的读法为:壹十贰亿玖千捌百叁十万贰千
原数字为:1003切换后的读法为:壹千零叁
原数字为:1030切换后的读法为:壹千零叁十
原数字为:1000切换后的读法为:壹千
原数字为:20000000切换后的读法为:贰千万
分享到:
评论
2 楼 542348257 2016-06-21  
数字为long型的时候 好像处理有点问题
1 楼 陈小妞 2016-01-05  
当你输入100003980的时候在万位会多一个万字

相关推荐

Global site tag (gtag.js) - Google Analytics