如何使用Culture将变量中的波斯数字转换为英文数字?

49

我想修改保存在变量中的波斯数字,格式如下:

string Value="۱۰۳۶۷۵۱"; 

string Value="1036751";

请问我应该如何像 Culture Info 这样使用简单的方式来实现呢?

这是我的示例代码:

List<string> NERKHCOlist = new List<string>();
NERKHCOlist = ScrappingFunction(NERKHCO, NERKHCOlist);
int NERKHCO_Price = int.Parse(NERKHCOlist[0]);//NERKHCOlist[0]=۱۰۳۶۷۵۱ 

<= 所以它无法将其解析为整数
而这是我的函数,它返回一个列表,其中包含波斯数字在列表项内。

protected List<string> ScrappingFunction(string SiteAddress, List<string> NodesList)
{    
    string Price = "null";
    List<string> Targets = new List<string>();
    foreach (var path in NodesList)
    {
        HtmlNode node = document.DocumentNode.SelectSingleNode(path.ToString());//recognizing Target Node
        Price = node.InnerHtml;//put text of target node in variable(PERSIAN DIGITS)
        Targets.Add(Price);
    }
    return Targets;
}

你是指 Scrapping 还是 Scraping - Enigmativity
18个回答

35

只需使用以下代码:

private string changePersianNumbersToEnglish(string input)
{
  string[] persian = new string[10] { "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };

   for (int j=0; j<persian.Length; j++)
      input = input.Replace(persian[j], j.ToString());

   return input;
 }

1
它仍然返回波斯语字符串!有任何想法吗? - Akbari
请更改Replace函数中的参数顺序 ;) - Reza F.Rad

29

我建议两种方法来处理这个问题(我为它们创建了一个扩展方法:extension method):

1.使用foreach和replace。

public static class MyExtensions
{
     public static string PersianToEnglish(this string persianStr)
     {
            Dictionary<char, char> LettersDictionary = new Dictionary<char, char>
            {
                ['۰'] = '0',['۱'] = '1',['۲'] = '2',['۳'] = '3',['۴'] = '4',['۵'] = '5',['۶'] = '6',['۷'] = '7',['۸'] = '8',['۹'] = '9'
            };
            foreach (var item in persianStr)
            {
                persianStr = persianStr.Replace(item, LettersDictionary[item]);
            }
            return persianStr;
     }
}

2.字典.聚合

public static class MyExtensions
{
      public static string PersianToEnglish(this string persianStr)
      {
            Dictionary<string, string> LettersDictionary = new Dictionary<string, string>
            {
                ["۰"] = "0",["۱"] = "1",["۲"] = "2",["۳"] = "3",["۴"] = "4",["۵"] = "5",["۶"] = "6",["۷"] = "7",["۸"] = "8",["۹"] = "9"
            };
            return LettersDictionary.Aggregate(persianStr, (current, item) =>
                         current.Replace(item.Key, item.Value));
      }
}

关于Dictionary.Aggregate的更多信息,请参见:Microsoft

用法:

string result = "۱۰۳۶۷۵۱".PersianToEnglish();

21

利用文化将数字从任何语言转换为任何语言

功能:

public static string ConvertDigitChar(this string str, CultureInfo source, CultureInfo destination)
{
    for (int i = 0; i <= 9; i++)
    {
        str = str.Replace(source.NumberFormat.NativeDigits[i], destination.NumberFormat.NativeDigits[i]);
    }
    return str;
}

public static string ConvertDigitChar(this int digit, CultureInfo destination)
{
    string res = digit.ToString();
    for (int i = 0; i <= 9; i++)
    {
        res = res.Replace(i.ToString(), destination.NumberFormat.NativeDigits[i]);
    }
    return res;
}

如何使用这些函数:

var fa = CultureInfo.GetCultureInfoByIetfLanguageTag("fa");
var en = CultureInfo.GetCultureInfoByIetfLanguageTag("en");
string str = "۰0۱1۲2۳3۴4۵5۶6۷7۸8۹9";
string r1 = str.ConvertDigitChar(en, fa);
string r2 = str.ConvertDigitChar(fa, en);
int i = 123456789;
string r3 = i.ConvertDigitChar(fa);

结果:

r1: "۰۰۱۱۲۲۳۳۴۴۵۵۶۶۷۷۸۸۹۹"

r2: "00112233445566778899"

r3: "۰۱۲۳۴۵۶۷۸۹"


1
有用的解决方案,特别是使用文化,谢谢。 - QMaster
1
从文化中获取数字让我感到更加自信 :) - Ahmad Ahmadi

11

我编写了这个扩展方法,将字符串中的阿拉伯和波斯数字转换为其拉丁表示。

public static class Extensions
{
    public static string ConvertDigitsToLatin(this string s)
    {
        var sb = new StringBuilder();
        for (int i = 0; i < s.Length; i++)
        {
            switch (s[i])
            {
                    //Persian digits
                case '\u06f0':
                    sb.Append('0');
                    break;
                case '\u06f1':
                    sb.Append('1');
                    break;
                case '\u06f2':
                    sb.Append('2');
                    break;
                case '\u06f3':
                    sb.Append('3');
                    break;
                case '\u06f4':
                    sb.Append('4');
                    break;
                case '\u06f5':
                    sb.Append('5');
                    break;
                case '\u06f6':
                    sb.Append('6');
                    break;
                case '\u06f7':
                    sb.Append('7');
                    break;
                case '\u06f8':
                    sb.Append('8');
                    break;
                case '\u06f9':
                    sb.Append('9');
                    break;

                    //Arabic digits    
                case '\u0660':
                    sb.Append('0');
                    break;
                case '\u0661':
                    sb.Append('1');
                    break;
                case '\u0662':
                    sb.Append('2');
                    break;
                case '\u0663':
                    sb.Append('3');
                    break;
                case '\u0664':
                    sb.Append('4');
                    break;
                case '\u0665':
                    sb.Append('5');
                    break;
                case '\u0666':
                    sb.Append('6');
                    break;
                case '\u0667':
                    sb.Append('7');
                    break;
                case '\u0668':
                    sb.Append('8');
                    break;
                case '\u0669':
                    sb.Append('9');
                    break;
                default:
                    sb.Append(s[i]);
                    break;
            }
        }
        return sb.ToString();
    }
}

1
这个可以同时更改阿拉伯数字和扩展阿拉伯数字。 - VSB

11

需要先解析它们,使用正确的文化规范,例如 Int32.Parse()。一旦将其作为纯整数,只需再次使用正确的文化规范调用 ToString() 即可。

另一种解决方案是逐个遍历字符串字符,并将任何波斯数字替换为相应的(西)阿拉伯数字。如果需要,可以保留其他字符。

如果该字符串确实包含数字,则应使用整数解析方法。如果不仅仅是数字,而是电话号码、序列号等,则可能需要使用替换算法。


1
请参阅 Int32.Parse Method (String, IFormatProvider) 的文档。 - tnw
我会选择TryParse,因为这种方法容易出现异常。 - tnw
1
Parse() 对电话号码和序列号处理效果不佳。 - H H

7
您可以手动进行转换,方法如下:
    char[][] numbers = new char[][]
    {
        "0123456789".ToCharArray(),"persian numbers 0-9 here".ToCharArray()
    };
    public void Convert(string problem)
    {
        for (int x = 0; x <= 9; x++)
        {
            problem.Replace(numbers[0][x], numbers[1][x]);
        }
    }

我不知道波斯数字,所以你需要将它们添加到字符数组中。

1
谢谢,但我想使用Culture Info。 - Amin AmiriDarban

4

有一个简单的方法可以做到这一点。

public static string Fa2En(string str)
{
  return str.Replace("۰", "0")
            .Replace("۱", "1")
            .Replace("۲", "2")
            .Replace("۳", "3")
            .Replace("۴", "4")
            .Replace("۵", "5")
            .Replace("۶", "6")
            .Replace("۷", "7")
            .Replace("۸", "8")
            .Replace("۹", "9");
}

2
Saeed的解决方案还不错,但是对于双变量,你还必须将“٫”字符替换为“.”,这样就可以使用:
private string ToEnglishNumber(string strNum)
{
string[] pn = { "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "٫" };
string[] en = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9","." };
string chash = strNum;
for (int i = 0; i < 11; i++)
    chash = chash.Replace(pn[i], en[i]);
return chash;
}

2
使用这个静态类可以轻松地更改规范化数字:
public static class Numbers
{
    public static string ChangeToEnglishNumber(this string text)
    {
        var englishNumbers = string.Empty;
        for (var i = 0; i < text.Length; i++)
        {
            if(char.IsNumber(text[i])) englishNumbers += char.GetNumericValue(text, i);
            else englishNumbers += text[i];
        }

        return englishNumbers;
    }
}

示例:

string test = "۱۰۳۶۷۵۱".ChangeToEnglishNumber(); // => 1036751

string.Concat(nums.Select(c => char.GetNumericValue(c) < 0 ? c.ToString() : char.GetNumericValue(c).ToString(CultureInfo.InvariantCulture))); - Alireza Jamali

1
    public static string ToEnglishNumber(string input)
    {

        var englishnumbers = new Dictionary<string, string>()
        {
            {"۰","0" }, {"۱","1" }, {"۲","2" }, {"۳","3" },{"۴","4" }, {"۵","5" },{"۶","6" }, {"۷","7" },{"۸","8" }, {"۹","9" },
            {"٠","0" }, {"١","1" }, {"٢","2" }, {"٣","3" },{"٤","4" }, {"٥","5" },{"٦","6" }, {"٧","7" },{"٨","8" }, {"٩","9" },

        };

        foreach (var numbers in englishnumbers)
            input = input.Replace(numbers.Key, numbers.Value);

        return input;
    }

您可以使用此代码将阿拉伯数字和波斯数字转换为英文数字。 - m.Kardaani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接