在多文化环境下处理货币有点棘手。评论中有一些有价值的建议,我建议你阅读一下。
据我所知,这对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及以上版本中
可用。
在.NET Framework 4及之前的版本中,所有线程的区域性默认设置为Windows系统区域性。对于当前区域性与默认系统区域性不同的应用程序,此行为通常是不希望的。在.NET Framework 4.5中,DefaultThreadCurrentCulture属性使应用程序能够定义应用程序域中所有线程的默认区域性。
如果您尚未明确设置正在应用程序域中执行的任何现有线程的区域性,则设置DefaultThreadCurrentCulture属性也会更改这些线程的区域性。但是,如果这些线程在另一个应用程序域中执行,则它们的区域性由该应用程序域中的DefaultThreadCurrentCulture属性定义,或者如果没有定义默认值,则由默认系统区域性定义。因此,我们建议您始终明确设置主应用程序线程的区域性,并且不依赖于DefaultThreadCurrentCulture属性来定义主应用程序线程的区域性。
除非显式设置,否则DefaultThreadCurrentCulture属性的值为空,并且未分配显式区域性的应用程序域中的线程的区域性由默认的Windows系统区域性定义。
CultureInfo
来猜测货币类型,因为这就是你将要做的事情。发票货币不会改变,即使目录价格进行本地化。请明确指定货币类型。如果你从亚马逊英国购买,货币可能与你的文化匹配(基于你的首选浏览器语言),但发票将以公司的货币计价。 - Panagiotis Kanavos