Как отформатировать дату / время / число / валюту в другой локали? - PullRequest
0 голосов
/ 05 марта 2012

Как мне отформатировать что-то для другой локали в Windows?

Например, в управляемом коде C # я бы попытался отобразить DateTime, используя en-US локаль с:

String s = DateTime.Now.ToString(CultureInfo.CreateSpecificCulture("en-US"));

TextRenderer.DrawText(
      e.Graphics, s, SystemFonts.IconTitleFont, 
      new Point(16, 16), SystemColors.ControlText);

И это прекрасно работает, когда локаль моего компьютера en-US:

enter image description here

Он даже отлично работает, когда локаль моего компьютера de-DE:

enter image description here

Но он полностью разваливается, когда локаль моего компьютера ps-AF:

enter image description here

Примечание: Мой пример кода находится в .NET, но может быть и собственным.


Обновление : Попытка установить System.Threading.Thread.CurrentThread.CurrentCulture в en-US перед вызовом DrawText:

var oldCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
try
{
//  String s = DateTime.Now.ToString(CultureInfo.CreateSpecificCulture("en-US"));
    String s = DateTime.Now.ToString();
    TextRenderer.DrawText(e.Graphics, s, SystemFonts.IconTitleFont, new Point(16, 16), SystemColors.ControlText);
}
finally         
{
    System.Threading.Thread.CurrentThread.CurrentCulture = oldCulture;
}

enter image description here

Без помощи.

  • Девять, без помощи
  • Джек, без помощи
  • Восемь, возможно прямой
  • Король, возможный флеш
  • Туз, без помощи
  • Шесть, возможно прямой
  • Дейв о любви к дилеру

Ace ставки.


Обновление два:

Из записи в блоге Майкла Каплана:

Иногда GDI уважает пользователей (даже если никто другой не делает!)

GDI не дает дерьма о форматировании или о чем-то, что связано с локалями, за одним единственным исключением:

Замена цифр

Каждый раз, когда вы переходите к отображению текста, он захватывает эти параметры подстановки цифр в локали пользователя (включая информацию о переопределении пользователя) и использует эту информацию, чтобы решить, как отображать числа.

И нет возможности переопределить эти настройки на уровне, где GDI их использует.

Интересно, как Chrome управляет им. Когда я пишу цифры здесь, в вопросе stackoverflow, Chrome отображает их, используя латинские цифры:

0123456789

См:

enter image description here

Ответы [ 2 ]

1 голос
/ 05 марта 2012

То, что вы видите, происходит из-за замены цифры , которая происходит, когда языковой стандарт вашей системы ps-AF.

Полагаю, все в порядке. Пользователи такого языка привыкли видеть цифры, представленные таким образом.

Обычно способ, которым это делается, немного отличается, см., Например, здесь , но на самом деле я не думаю, что это должно иметь какое-либо значение:

String s = DateTime.Now.ToString(new CultureInfo("en-US"));
0 голосов
/ 05 марта 2012

Альтернативой является установка Thread.CurrentCulture в желаемую локаль.

Т.е. сделать это:

Thread.CurrentCulture = new CultureInfo("en-US");

И тогда вы можете заменить первую строку вашего кода следующим:

String s = DateTime.Now.ToString();

Я не совсем уверен, ноПолагаю, что это решит проблему подстановки цифр, так как DrawText теперь будет основан на культуре en-US, а не ps-AF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...