[英]Decimal.Parse strange behavior on Chrome and Firefox
在MVC项目中,我在项目的web.Config中设置了一个变量,如下所示:
然后在我的代码中,获取该变量并将其解析为十进制:
如您所见,这很好,问题是当我在Google Chrome或Mozilla Firefox上运行代码时,会得到不同的结果:
我不明白为什么会发生这种情况,而不是在所有在Chrome上运行网络的机器上都发生这种情况,我所能想到的是,这似乎是浏览器配置中的内容,但它是标准安装,没有什么不同。
任何人都可以指出正确的方向吗? 还是对导致此行为的原因有一个想法?
更新:
文本代码(我不知道为什么,但是可以)
为了便于调试,我有以下内容:
public static decimal ServiceFee
{
get
{
var webConfigVar = ConfigurationManager.AppSettings["ServiceFee"];
decimal webConfigVarDecimal = decimal.Parse(webConfigVar ?? "0");
return webConfigVarDecimal;
}
}
通常是这样
public static decimal ServiceFee
{
get
{
return decimal.Parse(ConfigurationManager.AppSettings["ServiceFee"] ?? "0");
}
}
和Web.Config
<appSettings>
<add key="ServiceFee" value="0.024" />
</appSettings>
更新2
我知道代码在服务器上运行,但是唯一的区别是浏览器,并且始终与少数机器上的浏览器一起使用。
无论服务器是在本地运行还是在生产中运行
Decimal.Parse
使用当前请求请求处理线程的CultureInfo
,ASP.NET可以(尽管不是默认)根据浏览器的Accept
标头设置该文化信息-以便设置为法语或德语的浏览器将使用其格式设置规则(逗号分隔) ','
是基数位置,而不是点'.'
)。 这可能正在发生:您的Chrome浏览器设置为使用其他区域性。
解决方法是在调用任何Parse
或ToString
方法(如果它与人类可读的文本进行交互)时(例如,在加载配置文件时)指定CultureInfo.InvariantCulture
。
这就是为什么静态分析很重要(Visual Studio中的“分析”菜单)的原因-它可以指出这些错误。
(我个人认为应该从.NET中删除Parse
方法,并用显式的ParseFormatted(IFormatProvider, String)
和ParseInvariant(String)
-但这只是我:)
我注意到,总是无法在属性获取器中调用Parse
效率低下。 您应该只静态地对其进行缓存(使用新的C#6.0只读属性语法):
using System.Globalization;
public static decimal ServiceFee { get; } =
Decimal.Parse(
ConfigurationManager.AppSettings["ServiceFee"] ?? "0",
NumberStyles.Number,
CultureInfo.InvariantCulture
);
如果您经常这样做,则可能需要一种可重用的方法:
public static Decimal GetAppSettingDecimal(String name) {
String textualValue = ConfigurationManager.AppSettings[ name ];
Decimal ret;
return Decimal.TryParse( textualValue, NumberStyles.Number, CultureInfo.InvariantCulture, out ret ) ? ret : 0;
}
public static Decimal ServiceFee { get; } = GetAppSettingDecimal("ServiceFee");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.