【问题标题】:Custom NumberFormat for multi-language UWP app多语言 UWP 应用的自定义 NumberFormat
【发布时间】:2016-03-15 12:09:06
【问题描述】:

我正在开发一个多语言应用程序,该应用程序应该在所有语言中具有相同的 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?或者有没有更好的方法来达到我想要的结果?

【问题讨论】:

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


    【解决方案1】:

    将整个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;
    

    【讨论】:

      【解决方案2】:

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

      您可以在 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),
               };
      

      【讨论】:

      • 这是你的另一个答案,是从 Github 描述中复制粘贴的。
      • 用源代码更新
      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多