How can i convert english digits to arabic digits?

匿名 (未验证) 提交于 2019-12-03 02:47:02

问题:

I have this C# code for example

DateTime.Now.ToString("MMMM dd, yyyy");

Now the current thread is loading the Arabic culture. So the result is like this

???? 19, 2010

But i don't want the '2010' and the '19' to be in English (also known as Latin or West Arabic

I tried

DateTime.Now.ToString("MMMM dd, yyyy", CultureInfo.GetCultureInfo("ar-lb"));

gave the same result. So any idea?

回答1:

Thy this workaround (just list all cultures you want to use this numerals in the string array):

private static class ArabicNumeralHelper {     public static string ConvertNumerals(this string input)     {         if (new string[] { "ar-lb", "ar-SA" }               .Contains(Thread.CurrentThread.CurrentCulture.Name))         {             return input.Replace('0', '\u06f0')                     .Replace('1', '\u06f1')                     .Replace('2', '\u06f2')                     .Replace('3', '\u06f3')                     .Replace('4', '\u06f4')                     .Replace('5', '\u06f5')                     .Replace('6', '\u06f6')                     .Replace('7', '\u06f7')                     .Replace('8', '\u06f8')                     .Replace('9', '\u06f9');         }         else return input;     } }

Then use the method, for all of your strings you want to have 'central Arabic numerals' in, like this:

DateTime.Now.ToString().ConvertNumerals();


回答2:

As a quick test, I wrote this to list all the cutures which don't have "2010" in the year:

        foreach (var ci in              from c in CultureInfo.GetCultures(CultureTypes.AllCultures)             where !c.IsNeutralCulture             let date = DateTime.Now.ToString("MMMM dd, yyyy", c)             where !date.Contains("2010")             orderby c.Name             select new {c.Name, date})         {             Console.WriteLine("{0} : {1}", ci.Name, ci.date);         }

the results are:

To convert the numbers to Arabic text, it looks like this "NumToArabicString" project will do it. It doesn't look like there's anything built into the .net framework though.



回答3:

The only solution is to manually convert the digits.

You could use the CurrentCulture.NumberFormat.NativeDigits array instead of explicitly providing the Unicode characters to support any other languages in addition to the Arabic-Indic digits, but as far as builtin support by culture-aware classes such as DateTime it seems unimplemented or something.



回答4:

Try this:

public static string ToIndicDigits(this string input) {         return input.Replace('0', '\u0660')                 .Replace('1', '\u0661')                 .        
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!