我正在将应用程序从ASP.NET MVC转换为.NET Core,我曾在其中处理各种发票的货币类型。
Thread.CurrentThread.CurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);
CustomCulture.GetCultureInfo(string CountryCode)
取得了供应商的币种,并创建了具有一些默认格式和当前币种的自定义区域性。
我有一个模型,该模型具有一种货币类型,我们可以从数据库中提取供应商的国家/地区代码,并使用该代码为当前视图设置货币类型。
根据我的理解,由于视图在不同的线程上运行,因此这对ASP.Net Core无效。
本质上是货币类型会改变,例如$或R或€。
关于如何处理此问题的任何想法?
答案 0 :(得分:3)
在多元文化环境中处理货币有点棘手。评论中有一些有价值的建议。我建议您仔细阅读。
根据我的理解,由于视图在不同的线程上运行,因此这对ASP.Net Core无效。
您正在使用以下命令设置仅当前线程的文化:
Thread.CurrentThread.CurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);
在应用程序中创建新线程时,您必须为其重新设置。
相反,您可以使用DefaultThreadCurrentCulture
和DefaultThreadCurrentUICulture
(在应用程序启动时)在默认情况下为任何线程设置区域性:
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);
这还将使您可以在不同的地方指定不同的文化,这在某些情况下可能会有所帮助。