Как я могу отображать специфические для культуры собственные цифры вместо арабских цифр?

Я хочу, чтобы преобразовать числовое значение в строку, показывать конкретные цифры. Например, язык дари, используемый в Афганистане (культурное название "prs-AF"), использует Восточно-арабские цифры вместо арабские цифры используется в большинстве западных культур (0,1,2,3,4,5,6,7,8,9).

при рассмотрении класса CultureInfo, встроенного в фреймворк, он перечисляет правильные собственные цифры (скриншот, взятый из вывода в LinqPad):

linqpad output

CultureInfo.CreateSpecificCulture("prs-AF").NumberFormat.NativeDigits

однако при попытке преобразовать число в строку для отображения в этой культуре я не получаю собственные цифры:

linqpad output

var number = 123.5;
var culture = CultureInfo.CreateSpecificCulture("prs-AF");
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
var text = number.ToString(culture);
Console.WriteLine(text);

может ли кто-нибудь сказать мне, как отображать собственные цифры?

3 ответов


подстановка цифр-это то, что происходит при отображении текст, которые содержат цифры.

он не должен изменять строковое представление числа, как вы видели.

количество 123.5 форматируется как строка 123.5 независимо от замены цифр. Это, однако, отображается с соответствующими символами, если Thread.CurrentThread.CurrentCulture устанавливается соответственно, и если механизм представления поддерживает подстановку цифр. (Поддержка WPF do это)


Я посмотрел на NativeDigits propety и базовое поле в отражателе, и он, похоже, не используется ничем, когда дело доходит до форматирования (хотя Used by анализ в отражатель не гарантируется на 100%). Таким образом, возможно, что эти значения существуют только для справки или что-то в этом роде.

вы можете использовать свой собственный IFormatProvider реализация с помощью строкового вывода ToString(culture) и вручную заменяя все цифры соответствующими значениями из NativeDigits массив. Хотя, боюсь, это не тот ответ, который вы искали..


Возможно, вам нужно следующее:

var number = 123.5;
var culture = CultureInfo.CreateSpecificCulture("prs-AF");
var text = String.Format(culture, "{0}", number);
Console.WriteLine(text);