如何将印地语数字 (२०७४) 转换为 C# 中的数值?
how to convert Hindi numbers ( २०७४) to numeric value in c#?
我有一大组印地语数字,我想将它们转换成数值,但我不知道如何转换它们。请建议我实现这一目标的适当方法。
注意请不要建议我更换方法。
例如。将此数字 २०७४ 转换为相当于 2074。
我相信这就是您想要的,但请注意,此代码是由不会说印地语、不会阅读印地语或知道的人编写的印地语.
我在 the wikipedia page 上找到了数字,但我 完全不知道我在做什么。
google 页面(我只是通过谷歌搜索问题中原始字符串中的各个数字发现的)似乎表明以下内容:
- 0-9的数字是
०१२३४५६७८९
- 我点击了 link 并使用 url 的最后一个字符作为数字
- 请注意,必须将 4 作为 14 的第二个数字,而且似乎还有一个消歧后缀link
- 它们的 unicode 代码点范围从 2406 到 2415,顺序为
- 两位数字按照系统排列,所以它似乎只是一个使用不同代码点的 10 位数字系统
- 但请注意,示例太少,我无法绝对确定这对所有数字都适用
如果有人在这个答案中发现漏洞,我会把它记下来,但如果您认为它可以改进,请随时从中获取所有代码。
还请记住,OP 明确 要求非替换方法。整个事情可能可以用它写在一个 oneliner 中,但由于这似乎不是一个可以接受的答案,所以我们在这里。
综上所述,这是一个非字符串替换版本,它使用不同的符号模拟基本数字解析:
注意:这里有大约 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
我有一大组印地语数字,我想将它们转换成数值,但我不知道如何转换它们。请建议我实现这一目标的适当方法。 注意请不要建议我更换方法。
例如。将此数字 २०७४ 转换为相当于 2074。
我相信这就是您想要的,但请注意,此代码是由不会说印地语、不会阅读印地语或知道的人编写的印地语.
我在 the wikipedia page 上找到了数字,但我 完全不知道我在做什么。
google 页面(我只是通过谷歌搜索问题中原始字符串中的各个数字发现的)似乎表明以下内容:
- 0-9的数字是
०१२३४५६७८९
- 我点击了 link 并使用 url 的最后一个字符作为数字
- 请注意,必须将 4 作为 14 的第二个数字,而且似乎还有一个消歧后缀link
- 它们的 unicode 代码点范围从 2406 到 2415,顺序为
- 两位数字按照系统排列,所以它似乎只是一个使用不同代码点的 10 位数字系统
- 但请注意,示例太少,我无法绝对确定这对所有数字都适用
如果有人在这个答案中发现漏洞,我会把它记下来,但如果您认为它可以改进,请随时从中获取所有代码。
还请记住,OP 明确 要求非替换方法。整个事情可能可以用它写在一个 oneliner 中,但由于这似乎不是一个可以接受的答案,所以我们在这里。
综上所述,这是一个非字符串替换版本,它使用不同的符号模拟基本数字解析:
注意:这里有大约 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