繁体   English   中英

Decimal.Parse在Chrome和Firefox上的奇怪行为

[英]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浏览器设置为使用其他区域性。

解决方法是在调用任何ParseToString方法(如果它与人类可读的文本进行交互)时(例如,在加载配置文件时)指定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM