このように変数に保存されているペルシャの数字を変更したい:
string Value="۱۰۳۶۷۵۱";
に
string Value="1036751";
文化情報のような簡単な方法を使用してこれを行うにはどうすればよいですか?
私のサンプルコードは次のとおりです。
List<string> NERKHCOlist = new List<string>();
NERKHCOlist = ScrappingFunction(NERKHCO, NERKHCOlist);
int NERKHCO_Price = int.Parse(NERKHCOlist[0]);//NERKHCOlist[0]=۱۰۳۶۷۵۱
<=したがって、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;
}
この問題を処理するための2つのアプローチを提案します(それぞれに 拡張メソッド を作成します):
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;
}
}
2.Dictionary.Aggregate
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();
以下のコードを使用するだけです。
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;
}
文化を使用する数値を任意の言語から任意の言語に変換する
機能:
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:"۰۱۲۳۴۵۶۷۸۹"
たとえば、最初にそれらを解析する必要があります。正しいカルチャ指定子を持つInt32.Parse()。単純な整数として取得したら、正しいカルチャ指定子を使用してToString()を呼び出すだけです。
別の解決策は、文字列を1文字ずつウォークし、ペルシア数字である任意の文字を対応する (西)アラビア数字 に置き換えることです。その後、必要に応じて、他の文字をそのまま保存できます。
文字列に実際にnumberが含まれている場合は、整数解析メソッドを使用する必要があります。それが単なる番号ではなく、実際には電話番号、シリアル番号などである場合は、代わりに置換アルゴリズムを使用する必要があるかもしれません。
あなたはそのように手動でそれらを変換することができます
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]);
}
}
ペルシア語の数字がわからないので、char配列に追加する必要があります。
文字列内のアラビア数字とペルシア数字をラテン語表現に変換するこの拡張メソッドを作成しました
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();
}
}
ここで私のコードは変数のペルシア数字を英語に変換します、拡張メソッドによって(式の後にドットで使用できます)
private static readonly string[] pn = { "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };
private static readonly string[] en = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
public static string ToEnglishNumber(this string strNum)
{
string chash = strNum;
for (int i = 0; i < 10; i++)
chash = chash.Replace(pn[i], en[i]);
return chash;
}
public static string ToEnglishNumber(this int intNum)
{
string chash = intNum.ToString();
for (int i = 0; i < 10; i++)
chash = chash.Replace(pn[i], en[i]);
return chash;
}
このコードを使用する場合は、次のように記述する必要があります。txt1.Value.ToEnglishNumber();
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;
}
public static string ChangeNumberToEnglishNumber(string value)
{
string result=string.Empty;
foreach (char ch in value)
{
try
{
double convertedChar = char.GetNumericValue(ch);
if (convertedChar >= 0 && convertedChar <= 9)
{
result += convertedChar.ToString(CultureInfo.InvariantCulture);
}
else
{
result += ch;
}
}
catch (Exception e)
{
result += ch;
}
}
return result;
}
この拡張機能は、アラビア語キーボードにも使用できます。例: "۵"、 "٥"または "۴"、 "٤"
static char[][] persianChars = new char[][]
{
"0123456789".ToCharArray(),"۰۱۲۳۴۵۶۷۸۹".ToCharArray()
};
static char[][] arabicChars = new char[][]
{
"0123456789".ToCharArray(),"٠١٢٣٤٥٦٧٨٩".ToCharArray()
};
public static string toPrevalentDigits(this string src)
{
if (string.IsNullOrEmpty(src)) return null;
for (int x = 0; x <= 9; x++)
{
src = src.Replace(persianChars[1][x], persianChars[0][x]);
}
for (int x = 0; x <= 9; x++)
{
src = src.Replace(arabicChars[1][x], arabicChars[0][x]);
}
return src;
}
この静的クラスを使用して、正規化数を簡単に変更します。
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
便利で簡潔:
public static class Utility
{
// '۰' = 1632
// '0' = 48
// ------------
// 1632 => '۰'
//- 1584
//--------
// 48 => '0'
public static string GetEnglish(this string input)
{
char[] persianDigitsAscii = input.ToCharArray(); //{ 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641 };
string output = "";
for (int k = 0; k < persianDigitsAscii.Length; k++)
{
persianDigitsAscii[k] = (char) (persianDigitsAscii[k] - 1584);
output += persianDigitsAscii[k];
}
return output;
}
}
Windows.Globalization.NumberFormatting.DecimalFormatter クラスを使用して文字列を解析できます。これにより、サポートされている任意の記数法の文字列が解析されます(内部的に一貫している場合)。
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;
}