如何在另一个区域设置中格式化日期/时间/数字/货币?

时间:2012-03-05 14:42:06

标签: windows winapi localization internationalization

如何为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

没有帮助。

  • 九,没有帮助
  • 杰克,没有帮助
  • 八,可能直接
  • King,可能是同花顺
  • Ace,没有帮助
  • 六,可能直接
  • 对经销商的爱戴夫人

Ace赌注。


更新二:

来自Michael Kaplan的博客文章:

  

Sometimes, GDI respects users (even if no one else does!)

     

GDI并没有提供关于格式化的错误或与区域设置相关的任何事情,只有一个例外:

     

数字替换

     

每次去渲染文本时,它都会抓取用户区域设置中的数字替换设置(包括用户覆盖信息),并使用该信息来决定如何显示数字。

     

并且无法在GDI使用它们的级别覆盖这些设置。

我想知道 Chrome 如何管理它。当我在这里写数字时,在stackoverflow问题中,Chrome使用拉丁数字呈现它们:

0123456789

请参阅:

enter image description here

2 个答案:

答案 0 :(得分:1)

您所看到的是由于系统的区域设置为ps-AF时出现的digit substitution

我相信没问题 - 这种语言环境的用户习惯于以这种方式看到数字。

通常这样做的方式略有不同,例如参见here,但我实际上并不认为这应该有所不同:

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

答案 1 :(得分:0)

另一种方法是将Thread.CurrentCulture设置为您想要的区域设置。

即。这样做:

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

然后您可以用以下代码替换代码的第一行:

String s = DateTime.Now.ToString();

我不太确定,但我相信这会解决数字替换问题,因为DrawText现在将基于en-US文化,而不是ps-AF