将中文字符转换为阿拉伯数字

时间:2013-02-25 21:02:04

标签: objective-c numbers hashtable

我是编程新手,我从Objective C开始作为我的第一语言。 我正在搞乱一些书籍和教程,最后编写一个计算器...... 一切都很好,我正在进入(编程真的很有趣)

现在我问自己如何将阿拉伯数字翻译成中文数字 (例如阿拉伯语4是中文四,8是八,这意味着四+四=八 中国的数字系统有点不同于阿拉伯语它们有100,1000,10000和ja种类的扭曲的标志,这搞砸了我的大脑...无论如何,任何人都有一些建议,提示,技巧或解决方案,我怎么能告诉计算机如何使用这个数字,甚至如何用它们计算?

我认为一切皆有可能,所以我不会问"如果可能的话?"

3 个答案:

答案 0 :(得分:2)

考虑维基百科http://en.wikipedia.org/wiki/Chinese_numerals描述的中国数字系统(普通话),例如:

  • 45被解释为[4] [10] [5]并写成四十五
  • 114被解释为[1] [100] [1] [10] [4]并写成一百一十四

所以诀窍是将一个数字分解为10的幂:

x = c(k)* 10 ^ k + ... + c(1)* 10 + c(0)

其中k是10的最大幂,它除以x使得商至少为1.在上面的第二个例子中,114 = 1 * 10 ^ 2 + 1 * 10 + 4.

该x = c(k)* 10 ^ k + ... + c(1)* 10 + c(0)变为[c(k)][10^k]...[c(1)][10][c(0)]。再次在第二个例子中,114 = [1] [100] [1] [10] [4]。

然后将括号内的每个数字映射到相应的正弦图:

0 =〇

1 =一

2 =二

3 =三

4 =四

5 =五

6 =六

7 =七

8 =八

9 =九

10 =十

100 =百

1000 =千

10000 =万

只要您跟踪[c(k)][10^k]...[c(1)][10][c(0)]表单,就可以轻松转换为计算机可以处理的整数或相应的中文数字。所以我将这个[c(k)][10^k]...[c(1)][10][c(0)]形式存储在一个大小为k + 2的整数数组中。

答案 1 :(得分:1)

我不熟悉Objective-C,因此我无法为您提供iOS解决方案。 尽管如此,以下是Android的Java代码... 我认为它可以帮助你,也帮助了我。

double text2double(String text) {


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

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

    HashMap<String, ScaleIncrementPair> numWord = new HashMap<String, ScaleIncrementPair>();

    for (int i = 0; i < units.length; i++) {
        numWord.put(units[i], new ScaleIncrementPair(1, i));
    }   

    numWord.put("零", new ScaleIncrementPair(1, 0));
    numWord.put("两", new ScaleIncrementPair(1, 2));

    for (int i = 0; i < scales.length; i++) {
        numWord.put(scales[i], new ScaleIncrementPair(Math.pow(10, (i + 1)), 0));
    }

    double current = 0;
    double result = 0;

    for (char character : text.toCharArray()) {

        ScaleIncrementPair scaleIncrement = numWord.get(String.valueOf(character));
        current = current * scaleIncrement.scale + scaleIncrement.increment;
        if (scaleIncrement.scale > 10) {
            result += current;
            current = 0;
        }
    }

    return result + current;
}

class ScaleIncrementPair {
    public double scale;
    public int increment;

    public ScaleIncrementPair(double s, int i) {
        scale = s;
        increment = i;
    }
}

答案 2 :(得分:0)

您可以使用NSNumberFormatter

如下面的代码,首先从中文字符中获取NSNumber,然后将它们组合起来。

func getNumber(fromText text: String) -> NSNumber? {
    let locale = Locale(identifier: "zh_Hans_CN")
    let numberFormatter = NumberFormatter()
    numberFormatter.locale = locale
    numberFormatter.numberStyle = .spellOut
    guard let number = numberFormatter.number(from: text) else { return nil }
    print(number)
    return number
}