簡體   English   中英

ASP.Net核心多貨幣申請

[英]ASP.Net Core Multi Currency Application

我正在將一個應用程序從ASP.NET MVC轉換為.NET Core,我曾經在那里處理不同發票的貨幣類型。

 Thread.CurrentThread.CurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);

CustomCulture.GetCultureInfo(string CountryCode)使用供應商貨幣並創建了具有一些默認格式和當前貨幣類型的自定義文化。

我有一個具有貨幣類型的模型,我們從數據庫中提取供應商的國家代碼,並使用它來設置當前視圖的貨幣類型。

從我的理解來看,同樣不適用於ASP.Net Core,因為視圖在不同的線程上運行。

基本上它是貨幣類型,它將改變,例如$或R或€。

關於如何處理這個問題的任何想法?

在多文化環境中處理貨幣有點棘手。 評論中有一些有價值的建議; 我會建議你去看看。

從我的理解來看,同樣不適用於ASP.Net Core,因為視圖在不同的線程上運行。

使用以下方式設置當前線程的文化:

Thread.CurrentThread.CurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);

在您的應用程序中分叉新線程時,您必須再次為它設置它。

相反,您可以使用DefaultThreadCurrentCultureDefaultThreadCurrentUICulture (在應用程序啟動時)默認設置任何線程的文化,如下所示:

CultureInfo.DefaultThreadCurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);
CultureInfo.DefaultThreadCurrentUICulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);

我通常使用以下代碼(在應用程序啟動時)來處理文化設置:

CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("MyCultureValue");
//Setup things here for `cultureInfo` like currency in your case....

Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

Type type = typeof(CultureInfo);
type.InvokeMember("s_userDefaultCulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    cultureInfo,
                    new object[] { cultureInfo });

type.InvokeMember("s_userDefaultUICulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    cultureInfo,
                    new object[] { cultureInfo });

這些屬性在.NET Framework 4.5及以后版本中可用

在.NET Framework 4和早期版本中,默認情況下,所有線程的文化都設置為Windows系統文化。 對於當前文化與默認系統文化不同的應用程序,此行為通常是不合需要的。 在.NET Framework 4.5中,DefaultThreadCurrentCulture屬性使應用程序能夠定義應用程序域中所有線程的默認區域性。

如果尚未顯式設置在應用程序域中執行的任何現有線程的區域性,則設置DefaultThreadCurrentCulture屬性也會更改這些線程的區域性。 但是,如果這些線程在另一個應用程序域中執行,則它們的文化由該應用程序域中的DefaultThreadCurrentCulture屬性定義,或者,如果未定義默認值,則由默認系統區域定義。 因此,我們建議您始終顯式設置主應用程序線程的文化,而不是依賴DefaultThreadCurrentCulture屬性來定義主應用程序線程的文化。

除非明確設置,否則DefaultThreadCurrentCulture屬性的值為null,並且默認Windows系統區域定義尚未分配顯式區域性的應用程序域中的線程區域。

如果你已經擁有它想要的文化,那么你可以使用string.Format如下所示:

string.Format(Invoice.Vendor.VendorCurrency, "{0:C}", amount);

這也允許您在不同的地方指定不同的文化,這在某些情況下可能是有利的。

暫無
暫無

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

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