How can i convert English digits to Arabic digits?

前端 未结 7 737
有刺的猬
有刺的猬 2020-11-27 20:59

I have this C# code for example

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

Now the current thread is loading the Arabic culture. So the resu

相关标签:
7条回答
  • 2020-11-27 21:36

    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();
    
    0 讨论(0)
  • 2020-11-27 21:38

    I've taken @Marcel B approach/workaround as I'm facing the same issue as the original question states.

    In my case, it is for "ar-KW" Culture. The only difference is that I'm using the NumberFormat.NativeDigits which is already part of the CultureInfo.

    You can check that like this (based on your current thread scenario):

    Thread.CurrentThread.CurrentCulture.NumberFormat.NativeDigits
    

    So, the code will look like this:

    private static class ArabicNumeralHelper
    {
        public static string ConvertNumerals(this string input)
        {
            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    
            if (new string[] { "ar-lb", "ar-SA" }
                  .Contains(cultureInfo.Name))
            {
                return input.Replace('0', cultureInfo.NumberFormat.NativeDigits[0])
                            .Replace('1', cultureInfo.NumberFormat.NativeDigits[1])
                            .Replace('2', cultureInfo.NumberFormat.NativeDigits[2])
                            .Replace('3', cultureInfo.NumberFormat.NativeDigits[3])
                            .Replace('4', cultureInfo.NumberFormat.NativeDigits[4])
                            .Replace('5', cultureInfo.NumberFormat.NativeDigits[5])
                            .Replace('6', cultureInfo.NumberFormat.NativeDigits[6])
                            .Replace('7', cultureInfo.NumberFormat.NativeDigits[7])
                            .Replace('8', cultureInfo.NumberFormat.NativeDigits[8])
                            .Replace('9', cultureInfo.NumberFormat.NativeDigits[9]);
            }
            else return input;
        }
    }
    

    I hope it helps.

    0 讨论(0)
  • 2020-11-27 21:42

    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:

    ar-SA : ربيع الأول 05, 1431
    dv-MV : ربيع الأول 06, 1431
    prs-AF : ربيع الأول 06, 1431
    ps-AF : ربيع الأول 06, 1431
    th-TH : กุมภาพันธ์ 19, 2553
    

    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.

    0 讨论(0)
  • 2020-11-27 21:49

    Try this:

    public static string ToIndicDigits(this string input)
    {
            return input.Replace('0', '\u0660')
                    .Replace('1', '\u0661')
                    .Replace('2', '\u0662')
                    .Replace('3', '\u0663')
                    .Replace('4', '\u0664')
                    .Replace('5', '\u0665')
                    .Replace('6', '\u0666')
                    .Replace('7', '\u0667')
                    .Replace('8', '\u0668')
                    .Replace('9', '\u0669');
        }
    }
    
    0 讨论(0)
  • 2020-11-27 21:49

    You can use the Windows.Globalization.NumberFormatting.NumeralSystemTranslator class to translate between the Latin and any of the supported numeral systems. To translate to Arabic, set the NumeralSystem property to "Arab", then you can call the TranslateNumerals method.

    Alternatively you can just use Windows.Globalization.DateTimeFormatting.DateTimeFormatter class directly.

    0 讨论(0)
  • 2020-11-27 21:51

    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.

    0 讨论(0)
提交回复
热议问题