整数数字转读音 num2Voice

这是在某招聘网站上看到的某互联网公司职位描述下面给的一道程序题,原题如下:

【整数数字转读音】
string num2Voice(int num) { … }
例:输入:12345 输出:一万二千三百四十五
(时间20min内完成代码并能够跑通)

这道程序题个人感觉还是有点难度的,下面给出一个可能的实现方法,仅供参考,程序中可能会有考虑不全的地方,希望大家指正。

String num2Voice(int num) {
        if (num == 0) {
            return "零";
        }

        String[] voiceTbl1 = new String[] {
                "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"
        };

        String[] voiceTbl2 = new String[] {
                "十", "百", "千", "万", "亿"
        };

        int loopCount = 0;
        String voice = "";
        boolean isNegative = false;
        if (num < 0) {
            isNegative = true;
            num = -num;
        }

        while (num != 0) {
            int mod = num % 10000;
            num = num / 10000;
            if (mod != 0) {
                int d1 = mod % 10;
                int d2 = mod % 100 / 10;
                int d3 = mod % 1000 / 100;
                int d4 = mod / 1000;
                String tmp = "";
                if (d4 != 0) {
                    tmp += voiceTbl1[d4] + voiceTbl2[2]/*千*/;
                } else {
                    // 超过4位数并且百位数不为0时,千位数为0读音加0,比如10101
                    if (num != 0 && d3 != 0) {
                        tmp += voiceTbl1[0]/*零*/;
                    }
                }

                if (d3 != 0) {
                    tmp += voiceTbl1[d3] + voiceTbl2[1]/*百*/;
                } else {
                    // 超过4位数或者千位数不为0并且个位和十位不全为0的时候,
                    // 百位数为0时读时要加0,比如10001, 3010
                    if ((d4 != 0 || num != 0) && (d2 != 0 || d1 != 0)) {
                        tmp += voiceTbl1[0]/*零*/;
                    }
                }

                if (d2 != 0) {
                    tmp += voiceTbl1[d2] + voiceTbl2[0]/*十*/;
                } else {
                    // 百位数不为0并且个位数也不为0时,十位数为0时读时要加0,比如302
                    if (d3 != 0 && d1 != 0) {
                        tmp += voiceTbl1[0]/*零*/;
                    }
                }

                if (d1 != 0) {
                    tmp += voiceTbl1[d1];
                }
                voice = tmp + voice;
            }

            loopCount++;
            if (num != 0) {
                if (loopCount == 1) {
                    // 如果是整数个“小目标”不要加万
                    if (mod == 0 && num >= 10000 && num % 10000 == 0) {
                        continue;
                    }
                    voice = voiceTbl2[3]/*万*/ + voice;
                } else if (loopCount == 2) {
                    voice = voiceTbl2[4]/*亿*/ + voice;
                }
            }
        }

        if(isNegative) {
            voice = "负" + voice;
        }
        return voice;
    }

你可能感兴趣的:(整数数字转读音 num2Voice)