输入数字,输出数字读法

思路分析



实践代码

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


public class Num2String {

    //数字对应关系
    private static Map<Integer, String> numberStringMap = new HashMap<Integer, String>();

    //位数对应关系
    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, "万");

    }

    /**
     *  主函数,程序从这里开始执行
     */
    public static void main(String[] args) {

        //初始化 int数组,设定有一下6个数字;
        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) {
        //将数字由int 转化为  String 类型
        String intString = a + "";

        //将String类型 转化为 字符数组char[]
        char ichar[] = intString.toCharArray();

        //将字符数组 顺序颠倒 --> 比如:ichar = ['1','2','3'] ,执行revertCharArray(ichar)方法后,变为['3','2','1']
        //为什么要这样做呢? --> 为了方便数字从低位开始读起;
        char icharrevert[] = revertCharArray(ichar);

        int i = 0;
        String result = "";

        //从颠倒后的数组icharrevert中读取字符,每次读取4位,如果数组长度不足4位,则读取到数组最大长度即可;
        /**
         * 举例说明: 如输入的数字是 200 0042;
         * 顺序颠倒后,得到的字符数组icharrevert[] = ['2','4','0','0','0','0','2']
         * 第一次读取4个字符,2,4,0,0
         * 逆序读起,即0,0,4,2; 字符串读法为 零肆拾贰
         * 第二次读取3个字符;
         * 逆序读起,即2,0,0;字符串读法为贰佰,第二次读起所以,后面加一个万;最后输入读法为贰佰万;
         *
         * 最后输出结果为; 贰佰万零肆拾贰
         */
        while (i < icharrevert.length) {
            //一次读取字符数组中的4个字符
            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;
    }

    /**
     * 字符转换为字符串读法
     * @param num  字符数组
     * @param time 次数
     * @return
     */
    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) {
            /**
             * 每4位读一次,第二次读取完毕,后面加"万"
             */
            sb.append("万");
        } else if (time == 2) {
            /**
             * 每4位读一次,第三次读取完毕,后面加"亿"
             */
            sb.append("亿");
        }
        return sb.toString();
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值