【问题标题】:Decimal.Parse strange behavior on Chrome and FirefoxDecimal.Parse 在 Chrome 和 Firefox 上的奇怪行为
【发布时间】:2017-04-07 22:26:45
【问题描述】:

在 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

我知道代码在服务器上运行,但唯一的区别是浏览器,并且它总是在几台机器上使用这些浏览器。

无论服务器是在本地运行还是在生产环境中运行

【问题讨论】:

  • 将您的代码发布为 text
  • 另外,C#代码在服务器上运行;浏览器是什么应该无关紧要

标签: c# .net asp.net-mvc google-chrome firefox


【解决方案1】:

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");

【讨论】:

  • 完美男人!!刚刚好。我会考虑这个建议。谢谢大佬。
猜你喜欢
  • 2014-12-22
  • 1970-01-01
  • 2016-09-01
  • 2015-09-24
  • 2014-06-25
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2018-02-22
相关资源
最近更新 更多