Работа с валютой в мультикультурной среде немного сложна.Есть несколько ценных предложений в комментариях;Я рекомендую пройтись по ним.
То же самое не работает для 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 имеет значение null, а культура потоков в домене приложения, для которых не была назначена явная культура, определяется системной культурой Windows по умолчанию.