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

Ami*_*ban 27 .net c# cultureinfo persian string-parsing

我想更改保存在变量中的波斯数字,如下所示:

string Value="???????"; 
Run Code Online (Sandbox Code Playgroud)

string Value="1036751";
Run Code Online (Sandbox Code Playgroud)

我怎样才能使用像文化信息这样简单的方法来做到这一点?

我的示例代码是:

List<string> NERKHCOlist = new List<string>();
NERKHCOlist = ScrappingFunction(NERKHCO, NERKHCOlist);
int NERKHCO_Price = int.Parse(NERKHCOlist[0]);//NERKHCOlist[0]=??????? 
Run Code Online (Sandbox Code Playgroud)

<=所以它不能解析为int
这是在我的函数中,它返回列表项中包含波斯数字的列表

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;
}
Run Code Online (Sandbox Code Playgroud)

小智 19

只需使用以下代码:

private string toPersianNumber(string input)
{
  string[] persian = new string[10] { "?", "?", "?", "?", "?", "?", "?", "?", "?", "?" };

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

   return input;
 }
Run Code Online (Sandbox Code Playgroud)


M.R*_*017 12

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

功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

如何使用功能:

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);
Run Code Online (Sandbox Code Playgroud)

结果:

R1: "????????????????????"

R2: "00112233445566778899"

R3: "??????????"


Osk*_*ren 11

您需要首先解析它们,例如使用具有正确文化说明符的Int32.Parse().一旦你将它作为一个普通的整数,它只需要在它上面调用ToString(),再次使用正确的文化说明符.

另一种解决方案是逐字符串地处理字符串,并用相应的(西)阿拉伯数字替换任何波斯数字字符.如果需要,可以按原样保留其他字符.

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


Ima*_*our 11

我建议使用两种方法来解决此问题(我为每种方法创建一个扩展方法):

1.foreach和更换

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

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));
      }
}
Run Code Online (Sandbox Code Playgroud)

有关Dictionary.Aggregate:Microsoft的更多信息

用法:

string result = "???????".PersianToEnglish();
Run Code Online (Sandbox Code Playgroud)


Ham*_*jam 7

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


ism*_*ike 6

您可以像这样手动转换它们

    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]);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我不知道波斯数字,所以你必须将它们添加到char数组中.