输入数字输出对应的英文读法的简单逻辑(完成后没有做精简处理)

/**
     * 输入数字返回对应英文
     * 
     * @param sourceNum
     * @return
     */
    public String getNumStr(int sourceNum) {
        if (sourceNum < 1000)
            return want(sourceNum);
        Map<Integer, String> map = getMap();
        String sourceStr = sourceNum + "";
        int length = sourceStr.length();
        if (length % 3 != 0) { // 把字符串长度以0补齐成3的倍数
            int temp = 3 - length % 3;
            for (int i = 0; i < temp; i++) {
                sourceStr = "0" + sourceStr;
            }
        }

        String str = "";
        int l = sourceStr.length();

        int logo = 0; // 标识数据
        for (int i = l - 3; i >= 0; i -= 3) { // 从后面往前取,三位一次
            int pow = (int) Math.pow(1000, logo); // 用来判断是多少个单位,千位内,百万内,十亿内
            String substring = sourceStr.substring(i, i + 3);// 1取中间三个字符,组 成 "千"
                                                                // 这个单位
            int parseInt = Integer.parseInt(substring); // 把千做处理

            String result1 = want(parseInt);
            String temp = "";
            // 给返回值加上单位 千, 百万, 十亿
            if (pow != 1 && parseInt != 0) {
                String unit = map.get(pow);
                temp += " " + unit + " ";
            }
            if (parseInt != 0) {
                str = result1 + temp + str;
                if (i == l - 3
                        && Integer.parseInt(sourceStr.substring(l - 3, l - 2)) == 0) {
                    str = "and " + str;
                }
            }

            logo++;
        }

        if (str.trim().endsWith("and")) {
            str = str.substring(0, str.length() - 5);
        }
        if (str.trim().startsWith("and")) {
            str = str.substring(5);
        }
        return str;
    }

    /**
     * 需要对0做判断,中间有0的时候用and连接,连续有0时只用一个and
     * 
     * @param i
     * @return
     */
    public String want(int i) {
        Map<Integer, String> map = getMap();
        if (i >= 0 && i < 20) {
            return map.get(i);
        } else if (i >= 20) {
            String s = i + "";
            String str = "";
            String[] split = s.split("");
            int l = split.length;

            for (int j = 1; j < l; j++) {
                int k = Integer.parseInt(split[j]);// 得到当前循环到的数值
                if (k == 0) { // 当某一位是0的时候
                    while (j < l && k == 0) {
                        if (j == l - 1 && k == 0) { // 一直查看到最后一位如果还是0,直接返回
                            return str;
                        }
                        ++j; // 移动到下一位
                        int k1 = Integer.parseInt(split[j]);// 对下一位查看是否为0
                        k = k1;
                    }
                    str += "and "; // 不到最后一位就不是0了,就加一个and
                }
                int square10 = l - 1 - j; // 根据索引值,得知该值所在的位置,个位,百位,千位...
                int pow = (int) Math.pow(10, square10); // 根据数值的位置,判断是该加到什么状态,个十百千...
                if (square10 > 1) { // 还不是最后两个值
                    str += map.get(k) + " " + map.get(pow) + " ";
                } else if (square10 == 1) { // 已经到了十位
                    String temp = "";
                    if (!str.endsWith("and ") && str.trim().length() > 0) {
                        temp = "and ";
                    }
                    str += temp;
                    if (k > 1) { // 十位上的值是不是大于一,
                        str += map.get(k * pow); // 大于一的计算方式,在二十 三十 四十
                                                    // 里面取值,然后加上个位map取值
                        if (Integer.parseInt(split[j + 1]) > 0 && l > 3) { // 个位上的值大于0,传递来的数字大于99
                            str += "-";
                        } else if (Integer.parseInt(split[j + 1]) > 0 && l <= 3) {
                            str += " ";
                        }
                    } else { // 如果小于等于一,就直接拿出最后两位,在map取值
                        if (k == 1) { // 十位上不是0
                            str += map.get(k * 10
                                    + Integer.parseInt(split[j + 1]));
                            return str;
                        }
                    }
                } else { // 到了个位, 到这里十位上要么有0要么是大于2
                    if (k != 0) { // 如果不是0,取map值,是0就不写了
                        str += map.get(k);
                    }
                }
            }
            return str;
        }
        return null;
    }

    public Map<Integer, String> getMap() {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>() {
            {
                put(0, "zero");
                put(1, "one");
                put(2, "two");
                put(3, "three");
                put(4, "four");
                put(5, "five");
                put(6, "six");
                put(7, "seven");
                put(8, "eight");
                put(9, "nine");
                put(10, "ten");
                put(11, "eleven");
                put(12, "twelve");
                put(13, "thirteen");
                put(14, "fourteen");
                put(15, "fifteen");
                put(16, "sixteen");
                put(17, "seventeen");
                put(18, "eighteen");
                put(19, "nineteen");
                put(20, "twenty");
                put(30, "thirty");
                put(40, "fourty");
                put(50, "fifty");
                put(60, "sixty");
                put(70, "seventy");
                put(80, "eighty");
                put(90, "ninety");
                put(100, "hundred");
                put(1000, "thousand");
                put(1000000, "million");
                put(1000000000, "billion");
            }
        };

        return map;
    }

 

posted @ 2017-01-22 09:36  天涯已可  阅读(504)  评论(0编辑  收藏  举报