首页 > 解决方案 > 如何在 C# 中将印地语数字 (२०७४) 转换为数值?

问题描述

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

例如。将此数字 २०७४ 转换为 2074。

标签: c#hindidevanagari

解决方案


我相信这就是您所追求的,但请注意,此代码是由不会说印地语、阅读印地语或不懂印地语的人编写的。

我在维基百科页面上找到了数字,但我完全不知道我在做什么

谷歌页面(我只是通过谷歌搜索问题中原始字符串中的各个数字而找到的)似乎表明以下内容:

  • 0-9的数字是०१२३४५६७८९
    • 我点击了一个链接并使用 url 的最后一个字符作为数字
    • 请注意,必须将 4 作为 14 的第二个数字,并且该链接上似乎也有一个歧义后缀
  • 它们的 unicode 代码点按顺序从 2406 到 2415
  • 两位数字跟随系统到一个发球台,所以它似乎只是一个使用不同代码点的 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

推荐阅读