如何在C#中将印地文数字(२०७४)转换为数值?

时间:2018-07-31 12:11:10

标签: c# hindi devanagari

我有一大堆北印度语数字,我想将其转换为数值,但我不知道如何转换它们。请为我建议实现此目的的适当方法。 注意,请不要建议我替换方法。

例如将此数字转换为2074。

1 个答案:

答案 0 :(得分:1)

我相信这是您所追求的,但请注意,这段代码是由不会说印地语,读印地语或知道印地语的人编写的。 / p>

我在the wikipedia page上找到了数字,但是我完全不知道自己在做什么

google页面(我通过对问题中原始字符串中的各个数字进行谷歌搜索而发现)似乎指示以下内容:

  • 0-9的数字为०१२३४५६७८९
    • 我点击了一个链接,并使用了网址的最后一个字符作为数字
    • 请注意,必须获得4作为14的第二个数字,并且该链接上似乎也存在歧义后缀
  • 它们具有从2406到2415的unicode代码点,顺序为
  • 两位数数字跟随该系统到tee,因此它似乎只是一个使用不同代码点的10位数字系统
    • 但是请注意,对于我来说,例子太少了,不能完全肯定这适用于所有数字

如果有人在这个答案上打了个洞,我会记下它,但是如果您认为它可以改进,请随时从它中获取所有代码。

还请记住,OP 明确地要求使用不可替换的方法。整个内容可能可以用一个单行代码编写,但是既然这似乎不是一个可以接受的答案,那么我们就可以了。

话虽如此,这是一个非字符串替换版本,它使用不同的符号模仿了基本的数字解析:

注意:这里不存在大约7吨的错误处理,例如空字符串等。

public static bool TryParseHindiToInt32(string text, out int value)
{
    const int codePointForZero = 2406;
    const int codePointForNine = codePointForZero + 9;

    int sign = +1;

    int index = 0;
    if (index < text.Length && text[index] == '-') // todo: hindi minus?
    {
        index++;
        sign = -1;
    }

    value = 0;
    while (index < text.Length)
    {
        char c = text[index];
        if (c < codePointForZero || c > codePointForNine)
        {
            value = 0;
            return false;
        }

        if ((uint)value > 214748364u)
        {
            value = 0;
            return false;
        }

        value *= 10;
        value += (c - codePointForZero);
        index++;
    }

    value *= sign;
    return true;
}

测试:

string digits = "२०७४";
TryParseHindiToInt32(digits, out int i);
Console.WriteLine(i);

输出:

2074