将由特定于区域性的数字组成的Unicode字符串转换为整数值

时间:2013-05-19 05:32:02

标签: c# .net numbers globalization culture

我正在用马拉地语开发一个程序。在其中,我想通过获取它们的实际整数值来添加/验证在Marathi Unicode中输入的数字。

例如,在马拉地语中:

  • 45 = 45
  • 99 = 99

如何将此马拉地语字符串"४५"转换为实际的整数值,即45

我搜索了很多,但没有发现任何有用的东西。我尝试使用System.Text.Encoding.Unicode.GetString()获取字符串,然后尝试解析,但也失败了。

5 个答案:

答案 0 :(得分:4)

正确的方法是使用Char.GetNumericValue,它允许您将单个字符转换为相应的数字值,而不是构造完整的值。即Char.GetNumericValue('९')给你9。

根据您的目标,使用相应的不变数字替换每个国家数字字符并使用常规解析功能可能更容易。

Int32.Parse("९९".Replace("९", "9"))

答案 1 :(得分:2)

快速破解@ Alexi的回应。

public static double ParseValue(string value)
{
    return double.Parse(string.Join("",
        value.Select(c => "+-.".Contains(c)
           ? "" + c: "" + char.GetNumericValue(c)).ToArray()),
        NumberFormatInfo.InvariantInfo);
}

调用ParseValue(“123.321”)得到123.321作为结果

答案 2 :(得分:0)

这是一种(丑陋但有效)的方法,它将所有原生数字(根据当前文化)转换为拉丁数字。它将保持输入字符串中的所有其他字符不变:

// using System;
// using System.Diagnostics;
// using System.Globalization;
// using System.Text;

char[] latinDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

string ReplaceNativeWithLatinDigits(string stringContainingNativeDigits)
{
    char[] lookup;
    {
        string[] nativeDigits = CultureInfo.CurrentCulture.NumberFormat.NativeDigits;
        Debug.Assert(Array.TrueForAll(nativeDigits, _ => _.Length == 1));
        lookup = Array.ConvertAll(nativeDigits, new Converter<string, char>(_ => _[0]));
    }
    StringBuilder buffer = new StringBuilder(stringContainingNativeDigits);
    {
        for (int i = 0, n = buffer.Length; i < n; ++i)
        {
            int which = Array.IndexOf(lookup, buffer[i]);
            if (0 <= which && which <= 9)
            {
                buffer[i] = latinDigits[which];
            }
        }
    }
    return buffer.ToString();
}

这仅适用于每个原始数字长度恰好是一个字符的情况,在您的情况下,如果Thread.CurrentThread.CurrentCulture设置为CultureInfo.GetCultureInfo("mr-IN")

答案 3 :(得分:0)

我找到了解决方案...... 以下代码将给定的马拉地语数转换为其等效的拉丁数。
感谢@Alexei,我刚刚更改了一些代码并且工作正常......

 string ToLatinDigits(string nativeDigits)
    {
        int n = nativeDigits.Length;
        StringBuilder latinDigits = new StringBuilder(capacity: n);
        for (int i = 0; i < n; ++i)
        {
            if (char.IsDigit(nativeDigits, i))
            {
                latinDigits.Append(char.GetNumericValue(nativeDigits, i));
            }
            else if (nativeDigits[i].Equals('.') || nativeDigits[i].Equals('+') || nativeDigits[i].Equals('-'))
            {
                latinDigits.Append(nativeDigits[i]);
            }
            else
            {
                throw new Exception("Invalid Argument");
            }
        }
        return latinDigits.ToString();
    }

此方法适用于+和 - 数字 关心Guruprasad

答案 4 :(得分:0)

除了拉丁语之外,

Windows.Globalization.DecimalFormatter将解析不同的numeral systems,包括梵文(这是马拉地使用的)。