У меня есть этот код C#, например,
DateTime.Now.ToString("MMMM dd, yyyy");
Теперь текущий поток загружает арабскую культуру. Таким образом, результат похож на это
???? 19, 2010
Но я не хочу '2010' и '19' быть на английском языке (также известный как латинские или Западные арабские цифры) - я хочу Восточные арабские цифры как "٢".
Я попробовал
DateTime.Now.ToString("MMMM dd, yyyy", CultureInfo.GetCultureInfo("ar-lb"));
дал тот же результат. Так какая-либо идея?
Это обходной путь (просто перечислите все культуры, в которых вы хотите использовать эти цифры в массиве строк):
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;
}
}
Затем используйте метод для всех ваших строк
, которые вы хотите иметь 'центральными арабскими цифрами 'in, например:
DateTime.Now.ToString().ConvertNumerals();
Мы используем арабские цифры в английском языке. Таким образом, то, что вы видите, является правильным и единственно возможным поведением.
В качестве быстрого теста я написал это, чтобы перечислить все сокращения, в которых нет "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 что-то встроено.
Единственным решением является ручное преобразование цифр.
Вы можете использовать массив CurrentCulture.NumberFormat.NativeDigits
вместо явного предоставления символов Unicode для поддержки любых других языков в дополнение к арабско-индийским цифрам, но что касается встроенной поддержки классами с поддержкой культур, такими как DateTime
, то она кажется нереализованной или что-то вроде того.