用于多语言UWP应用程序的自定义NumberFormat

时间:2016-03-15 12:09:07

标签: c# xaml windows-runtime winrt-xaml win-universal-app

我正在开发一个多语言应用,它应该在所有语言中使用相同的NumberFormat和DateTimeFormat(总共4个)。 我认为实现这一目标的最佳方法是仅将这些格式设置一次,而不是每次将值转换为字符串时,因为这可能会忘记某些值并导致错误。

在Silverlight应用程序中,这可以通过以下方式实现:

var cultureInfo = new CultureInfo(languageCode);
cultureInfo.NumberFormat.NumberGroupSeparator = " ";
cultureInfo.NumberFormat.NumberDecimalDigits = 2;
cultureInfo.NumberFormat.NumberDecimalSeparator = ",";
cultureInfo.DateTimeFormat.ShortDatePattern = "dd'/'MM'/'yyyy";
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;

由于Thread.CurrentThread.CurrentCulture不再可用,我改用CultureInfo.CurrentCulture。 不幸的是,使用此方法似乎没有在整个应用程序中设置自定义cultureInfo。我在OnLaunched方法中设置了文化,所以我认为它是在正确的线程上设置的。

我知道,自WinRT以来,应用只运行应用程序拥有资源的一种文化,但这是否意味着我们不能再覆盖NumberFormat?或者有更好的方法来实现我想要的结果吗?

2 个答案:

答案 0 :(得分:0)

使用自定义格式替换整个CultureInfo时,不会保留格式,但可以实例化各个格式并将其设置为当前文化。

var cultureInfo = new CultureInfo(languageCode);

NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberGroupSeparator = " ";
nfi.NumberDecimalDigits = 2;
nfi.NumberDecimalSeparator = ",";

DateTimeFormatInfo dtfi = new DateTimeFormatInfo();
dtfi.ShortDatePattern = "dd'/'MM'/'yyyy";

CultureInfo.CurrentCulture = cultureInfo;
CultureInfo.CurrentCulture.NumberFormat = nfi;
CultureInfo.CurrentCulture.DateTimeFormat = dtfi;

答案 1 :(得分:-1)

DateTimeFormatter类提供了一种全局感知方法,用于将日期或时间格式化为字符串以显示给用户。它可以使用当前用户的默认首选项,也可以覆盖这些首选项以指定其他语言,地理区域以及时钟和日历系统。调用者可以使用众所周知的常量(短期,长期,短期或长期)请求格式,或者定义所需的特定元素。

您可以在GitHub中从Microsoft获得演示。 Date and time formatting sample

 DateTimeFormatter[] timeFormatters = new[]
        {
            // Example formatters for times.
            new DateTimeFormatter(
                HourFormat.Default, 
                MinuteFormat.Default, 
                SecondFormat.Default),
            new DateTimeFormatter(
                HourFormat.Default, 
                MinuteFormat.Default, 
                SecondFormat.None),
            new DateTimeFormatter(
                HourFormat.Default, 
                MinuteFormat.None, 
                SecondFormat.None),
         };