输入数字输出对应的英文读法的简单逻辑(完成后没有做精简处理)
/** * 输入数字返回对应英文 * * @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; }
这个人很懒,什么也没下留。