讨论/题目交流/跪求:中文数字转阿拉伯数字算法/
跪求:中文数字转阿拉伯数字算法

比如
二千亿零一百零一万零二百 转为 200001010200

阿拉伯数字转中文了搞了半天弄出来了,中文数字转阿拉伯数字一直写不出来~~~跪求

共 2 个回复

从右往左遍历中文字符串,累加起来,试试。二百:2X100, 一万:1X1000就这样…把中文和阿拉伯数 百十千万亿都建立映射。类似之前的罗马数字和阿拉伯数的转化。
一二三四五六七八九 : 1,2,3,4,5,6,7,8,9
个十百千万亿:1,10,100,1000,10000,100000000
在字符串右边加上 个,
在字符串左边加上 # 或其他的表示边界的符号.

遍历到个,取到下一个比 个 级高的位数 之间的数字累加,乘以 个.
同理 取 十 百 千 等....

如 #一万一千零五十五个:
遍历到 个 --> 遍历到 十: 十 与 个之间的数加起来 乘以 个 即 5X1
继续遍历到 千 千与十之间的数 加起来 乘以 十 即 5X10
继续遍历到 万 万与千之间的数 加起来 乘以 千 即 1X1000
继续遍历到 # #到万之间的数 加起来 乘以 万 1X10000
最后累加起来: 11055

1
public static void main(String[] args) {
    String s = "二千亿零一百零一万零二百 ";

    System.out.println(calculate(s));

}

public static long calculate(String s) {
    s = s.replaceAll("零", "");

    int yIndex = s.indexOf("亿");
    int wIndex = s.lastIndexOf("万");

    wIndex = wIndex < yIndex ? -1 : wIndex;

    if (yIndex != -1 && wIndex != -1) {
        return subCal(s.substring(0, yIndex)) * 100000000 + subCal(s.substring(yIndex + 1, wIndex)) * 10000 + subCal(s.substring(wIndex + 1));
    }
    if (yIndex != -1) {
        return subCal(s.substring(0, yIndex)) * 100000000 + subCal(s.substring(wIndex + 1));
    }
    if (wIndex != -1) {
        return subCal(s.substring(0, wIndex)) * 10000 + subCal(s.substring(wIndex + 1));
    }
    return subCal(s.substring(wIndex + 1));
}

private static long subCal(String s) {

    Map<Character, Integer> map = new HashMap<>();
    map.put('一', 1); map.put('二', 2); map.put('三', 3); map.put('四', 4); map.put('五', 5); map.put('六', 6);
    map.put('七', 7); map.put('八', 8); map.put('九', 9);

    int tenIndex = s.indexOf("十");
    int hanIndex = s.indexOf("百");
    int thouIndex = s.indexOf("千");
    long res = 0;
    if (thouIndex != -1) {
        res = res + map.get(s.charAt(thouIndex - 1)) * 1000;
    }
    if (hanIndex != -1) {
        res = res + map.get(s.charAt(hanIndex - 1)) * 100;
    }
    if (tenIndex != -1) {
        res = res + ((tenIndex - 1 < 0 ? 1 : map.get(s.charAt(tenIndex - 1))) * 10);
    }
    if (map.containsKey(s.charAt(s.length() - 1))) {
        res = res + map.get(s.charAt(s.length() - 1));
    }
    return res;
}