感谢所有提供经验和建议的人。
实现一个自定义类型/结构来保存我自己的 Decimal 值并不是我真正想要的,也不会真正给我所需的功能(我已经可以以适当的本地货币/格式显示十进制值,我只是无法在需要时将它们转换回英国格式)。
问题是网络配置中的这一行:
<globalization culture="auto" enableClientBasedCulture="true"/>
设置culture = "auto" 允许.NET 根据浏览器提供的值设置区域设置(顺便说一下,根据MSDN,'enableClientBasedCulture' 没有实现——所以你可以省略它)。因此,如果来自法国的访问者(在他们的浏览器中配置了语言“fr-FR”)访问了我们的网站,所有数字格式都可以正常工作(正确的小数分隔符和货币符号),但我稍后在尝试时会遇到问题将该数字从它的欧洲格式转换为我需要的英国/美国格式。
这很奇怪,但是将“123.00”转换为“fr-FR”语言环境会产生 FormatException,因为“123.00”在法语语言环境中无效(它需要“123,00”)。但是,将“123,00”(fr-FR)转换为英国/美国“en-GB”或“en-US”格式不会产生错误,而是将值变为“123,000”。我相信这应该抛出一个 FormatException 因为添加另一个零是不可接受的。
我实施的解决方案如下:
- 在 web.config 中将culture="auto" 设置为culture="en-GB"。
- 使用 Decimal.ToString("c", ni) - 其中 'ni' 是自定义 NumberFormatInfo 类。
由于我现有的代码连接到我们的数据源以根据国家/地区检索正确的十进制值,因此我现在所拥有的只是一个格式问题。因此,要根据“fr-FR”区域设置格式化数字,您可以执行以下操作:
NumberFormatInfo ni = Globalization.CultureInfo.GetCultureInfo("fr-FR").NumberFormat;
Decimal.ToString("c", ni);
在这个设置中,我所有的十进制值(内部)总是被视为 en-GB 小数,因此是我需要的格式。换句话说,我的应用程序不需要能够更改应用于整个当前线程的设置的灵活性;而恰恰相反:我只关心以不同的方式格式化值。