2010-02-19 3 views
10

У меня есть этот код C#, напримерКак я могу преобразовать английские цифры в арабские цифры?

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

Теперь текущий поток загружается арабскую культуру. Таким образом, результат, как этот

???? 19, 2010 

Но я не хочу «2010» и «19», чтобы быть на английском языке (также известный как латынь или West Arabic цифр) - Я хочу Востока арабские цифры, как «2 ».

Я попытался

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

дал тот же результат. Итак, любая идея?

+4

Что вы ожидаете от этого? http://en.wikipedia.org/wiki/Arabic_digits –

+3

арабские цифры – LolaRun

ответ

13

Thy этот обходной путь (просто перечислить все культуры, которые вы хотите использовать эти цифры в массиве строк):

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; 
    } 
} 

Затем использовать метод, для всех ваших strings вы хотите иметь «центральные арабские цифры» в, например:

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

Статья в Википедии, на которой вы ссылаетесь, гласит, что стандартные арабские цифры используются в арабском мире и что восточноа арабские цифры, на которые вы ссылаетесь, используются только в нескольких конкретных странах. – ceejayoz

+0

Это очень хороший способ обхода, и нет другого пути – LolaRun

0

Мы используем арабские цифры на английском языке. Таким образом, то, что вы видите, - это правильное - и только возможное - поведение.

+3

Английские цифры называются арабскими, но арабы представляют их по-разному как таковые 0-9: – LolaRun

+0

Это действительно должно быть комментарий ... –

6

Как быстро испытание, я написал это список всех cutures, которые не имеют «2010» в этом году:

 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); 
     } 

результаты:

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

Чтобы преобразовать цифры на арабский текст, похоже, что this "NumToArabicString" project сделает это. Однако не похоже, что в инфраструктуре .NET есть что-то.

4

Единственное решение - это вручную преобразовать цифры.

Вы можете использовать CurrentCulture.NumberFormat.NativeDigits массив вместо явного предоставления символов Unicode для поддержки любых других языков, помимо арабской индоевропейских цифры, но, насколько встроенная поддержка культурно-курса классов, таких как DateTime кажется невыполненной или что-то ,

2

Попробуйте это:

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'); 
    } 
} 
2

Вы можете использовать Windows.Globalization.NumberFormatting.NumeralSystemTranslator класс для перевода между латинским и любой из поддерживаемых систем счисления. Чтобы перевести на арабский язык, установите NumeralSystem на номер "Arab", затем вы можете позвонить по телефону TranslateNumerals.

В качестве альтернативы вы можете просто использовать класс Windows.Globalization.DateTimeFormatting.DateTimeFormatter.