Как я могу отображать специфичные для культуры нативные цифры вместо арабских цифр? - PullRequest
19 голосов
/ 05 июня 2011

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

При проверке класса CultureInfo, встроенного в Framework, в нем перечислены правильные собственные цифры (снимок экрана, полученный из вывода в 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 ]

13 голосов
/ 05 июня 2011

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

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

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

3 голосов
/ 05 июня 2011

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

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

1 голос
/ 05 июня 2011

Может быть, вам нужно это:

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