簡體   English   中英

自定義NumberFormat用於多語言UWP應用

[英]Custom NumberFormat for multi-language UWP app

我正在開發一種多語言應用程序,該應用程序在所有語言(總共4種)中應具有相同的NumberFormat和DateTimeFormat。 我覺得實現此目標的最佳方法是僅將這些格式設置一次,而不是每次將值轉換為字符串時都設置一次,因為這可能會遺忘某些值並導致錯誤。

在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了? 還是有更好的方法來達到我想要的結果?

用自定義格式替換整個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;

DateTimeFormatter類提供了一種全球通用的方法,用於將日期或時間格式化為字符串以顯示給用戶。 它可以使用當前用戶的默認首選項,或者調用者可以覆蓋這些首選項以指定其他語言,地理區域以及時鍾和日歷系統。 調用者可以使用眾所周知的常量(短時間,長時間,短日期或長日期)請求格式,或定義所需的特定元素。

您可以在GitHub上從Microsoft獲得演示。 日期和時間格式化示例

 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),
         };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM