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

Я хочу преобразовать числовое значение в строку, отображая цифры, специфичные для конкретной культуры. Например, язык Дари, используемый в Афганистане (название культуры "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);

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

Ответы

Ответ 1

Подстановка цифр - это то, что имеет место, когда вы показываете текст, содержащий цифры.

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

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

Ответ 2

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

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

Ответ 3

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

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