2010-03-22 63 views
0

無論選擇何種文化,我都希望以一致的方式在整個應用程序中格式化數字。事實上,即使我們正在使用的基本文化,它也是「非標準的」。在ASP.NET應用程序中爲現有的.NET CultureInfo創建NumberFormat

我想將「{1500.50:c}」的格式設置爲'1500.50',但我的文化'nl-NL'的標準是:'€1.500,00'。我們沒有註冊自定義文化的用戶權限,因爲它是一個web應用程序,因此我們正在尋找一個運行時解決方案。

我們想要一個「一勞永逸」的解決方案。不是具有靜態(擴展)方法的Util類,而是一個應用程序範圍的解決方案,因此我們可以繼續使用遵循我們的自定義規則的標準.ToString(「c」)或ToString(「N」)邏輯。這將是改變文化的.NumberFormat,但是如何?一切似乎都是隻讀的。

謝謝。

回答

1

我會創造上所有的網頁都派生的基類,並設置要對那裏的文化,像這樣的參數:

public class PageBase : Page 
{ 
    protected override void InitializeCulture() 
    { 
     var culture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name); 
     culture.NumberFormat.CurrencySymbol = string.Empty; 
     culture.NumberFormat.NumberDecimalDigits = 2; 
     culture.NumberFormat.NumberDecimalSeparator = "."; 
     culture.NumberFormat.NumberGroupSeparator = ","; 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 

     base.InitializeCulture(); 
    } 
} 

或者你可以建立自己的文化關閉現有:

public class PageBase : Page 
{ 
    protected override void InitializeCulture() 
    { 
     var culture = CultureInfo.CreateSpecificCulture("en-US"); 
     culture.NumberFormat.CurrencySymbol = string.Empty; 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 

     base.InitializeCulture(); 
    } 
} 
+0

.CreateSpecificCulture是我缺失的鏈接,我無法獲得可寫文化。我把它放在Global.axas(HttpApplication).Begin_Request事件中。現在每個請求都被分配了我的文化。 – 2010-03-22 22:17:14

0

如果您確實想要以一致的方式格式化數字,則無論選擇何種文化,您都應該使用特定格式模式(「#。##」)和InvariantCulture(如果不變文化不會沒有數字格式屬性所需的值,您可以爲此創建自己的「不變」文化。設置線程的當前文化可能會產生其他意想不到的後果,因爲默認情況下會將此文化用於所有格式化和解析,其中一些可能無法控制。

順便說一下,您不必使用CreateSpecificCulture;你可以直接創建一個CultureInfo:

 CultureInfo currentWithOverriddenNumber = new CultureInfo(CultureInfo.CurrentCulture.Name); 
     currentWithOverriddenNumber.NumberFormat.CurrencyPositivePattern = 0; // make sure there is no space between symbol and number 
     currentWithOverriddenNumber.NumberFormat.CurrencySymbol = ""; // no currency symbol 
     currentWithOverriddenNumber.NumberFormat.CurrencyDecimalSeparator = "."; //decimal separator 
     currentWithOverriddenNumber.NumberFormat.CurrencyGroupSizes = new int[] { 0 }; //no digit groupings 
     currentWithOverriddenNumber.NumberFormat.NumberGroupSizes = new int[] { 0 }; 
     currentWithOverriddenNumber.NumberFormat.NumberDecimalSeparator = "."; //decimal separator 

     Thread.CurrentThread.CurrentCulture = currentWithOverriddenNumber; 
+0

關鍵是我們需要支持兩種不同的風格,這些風格與我們正在使用的文化脫節,但應該貫穿整個應用。使用不變文化格式的格式不是最佳解決方案。 感謝您的意見。 – 2010-03-25 10:42:44

相關問題