Как я могу преобразовать английские цифры в арабские цифры? - PullRequest
10 голосов
/ 19 февраля 2010

У меня есть этот код C # например

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

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

???? 19, 2010

Но я не хочу, чтобы '2010' и '19' были на английском языке (также известный как латиница или западно-арабский цифры) - я хочу восточно-арабские цифры, такие как "٢".

Я пытался

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

дал тот же результат. Так есть идеи?

Ответы [ 6 ]

13 голосов
/ 19 февраля 2010

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

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();
6 голосов
/ 19 февраля 2010

В качестве быстрого теста я написал это, чтобы перечислить все вырезки, которые не имеют «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

Чтобы преобразовать числа в арабский текст, похоже, что этот проект "NumToArabicString" сделает это.Не похоже, что в .net Framework что-то встроено.

4 голосов
/ 19 мая 2010

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

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

3 голосов
/ 13 августа 2013

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

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 голосов
/ 24 сентября 2013

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

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

0 голосов
/ 19 февраля 2010

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

...