ASP.Net Core多币种应用程序

时间:2019-06-25 09:51:02

标签: c# asp.net asp.net-core

我正在将应用程序从ASP.NET MVC转换为.NET Core,我曾在其中处理各种发票的货币类型。

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

CustomCulture.GetCultureInfo(string CountryCode)取得了供应商的币种,并创建了具有一些默认格式和当前币种的自定义区域性。

我有一个模型,该模型具有一种货币类型,我们可以从数据库中提取供应商的国家/地区代码,并使用该代码为当前视图设置货币类型。

根据我的理解,由于视图在不同的线程上运行,因此这对ASP.Net Core无效。

本质上是货币类型会改变,例如$或R或€。

关于如何处理此问题的任何想法?

2 个答案:

答案 0 :(得分:3)

在多元文化环境中处理货币有点棘手。评论中有一些有价值的建议。我建议您仔细阅读。

  

根据我的理解,由于视图在不同的线程上运行,因此这对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 Core 1.0及更高版本中的available

  

在.NET Framework 4和早期版本中,默认情况下,所有线程的区域性都设置为Windows系统区域性。对于当前区域性与默认系统区域性不同的应用程序,此行为通常是不希望的。在.NET Framework 4.5中,DefaultThreadCurrentCulture属性使应用程序可以定义应用程序域中所有线程的默认区域性。

     

如果尚未显式设置在应用程序域中执行的任何现有线程的区域性,则设置DefaultThreadCurrentCulture属性也会更改这些线程的区域性。但是,如果这些线程在另一个应用程序域中执行,则它们的区域性由该应用程序域中的DefaultThreadCurrentCulture属性定义,或者,如果未定义默认值,则由默认系统区域性定义。因此,我们建议您始终显式设置主应用程序线程的区域性,而不要依赖DefaultThreadCurrentCulture属性来定义主应用程序线程的区域性。

     

除非进行了明确设置,否则DefaultThreadCurrentCulture属性的值为null,并且默认Windows系统区域性定义了应用程序域中尚未分配显式区域性的线程区域性。

答案 1 :(得分:2)

如果您已经拥有了想要的文化,那么您可以像这样使用string.Format

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

这还将使您可以在不同的地方指定不同的文化,这在某些情况下可能会有所帮助。