.net - decimal.TryParse() 丢弃前导 "1"

标签 .net

简短而甜蜜的版本:

在大约一百台测试机器中的一台机器上,decimal.TryParse() 正在将“1.01”转换为 0.01

好吧,这听起来很疯狂,但请耐心等待...

我们有一个客户端应用程序,它通过 JSON 与网络服务通信,该服务将十进制值作为字符串返回,因此我们将其作为字符串存储在我们的模型对象中:

[DataMember(Name = "value")]
public string Value { get; set; }

当我们在屏幕上显示该值时,它被格式化为特定的小数位数。所以我们使用的过程是字符串->十进制然后十进制->字符串。

该应用程序目前正在进行最终测试,并在 100 多台机器上运行,一切正常。然而,在一台机器上,如果十进制值有一个前导“1”,那么它会被一个零替换。我在代码中添加了简单的日志记录,所以它看起来像这样:
Log("Original string value: {0}", value);
decimal val;
if (decimal.TryParse(value, out val))
{
    Log("Parsed decimal value: {0}", val);
    string output = val.ToString(format, CultureInfo.InvariantCulture.NumberFormat);
    Log("Formatted string value: {0}", output);
    return output;
}

在我的机器上 - 任何其他客户端机器 - 日志文件输出是:

  • Original string value: 1.010000
  • Parsed decimal value: 1.010000
  • Formatted string value: 1.01


在有缺陷的机器上,输出是:

  • Original string value: 1.010000
  • Parsed decimal value: 0.010000
  • Formatted string value: 0.01


因此,decimal.TryParse 方法似乎有问题。

我们尝试过的事情:
  • 卸载和重新安装客户端应用程序
  • 卸载和重新安装 .net 3.5 sp1
  • 将故障机器的数字区域设置(使用英语(英国))与工作机器的区域设置进行比较 - 没有区别。

  • 有没有人见过这样的事情或有什么建议?我很快就没有想法了...

    当我输入这个时,一些更多的信息进来了:将字符串值“10000”传递给 Convert.ToInt32() 返回 0,所以这似乎也去掉了前导 1。

    基于评论的进一步测试:
  • 1.01 -> 0.01
  • 111.01 -> 11.01
  • 123.01 -> 23.01
  • 231.01 -> 231.01
  • 01.01 -> 1.01

  • 因此,它似乎只影响 1 并且仅当它们是字符串的第一个字符时。很奇怪,但至少它是一致的。

    最佳答案

    我能够重现您的结果。
    考虑:

    public NumberFormatInfo OneIsPositiveSignFormat()
    {
        NumberFormatInfo custom = new NumberFormatInfo();
        custom.PositiveSign = "1";
        return custom;
    }
    

    进而:
    if (decimal.TryParse(value, NumberStyles.Number, OneIsPositiveSignFormat(), out val))
    

    问题是:区域设置不显示当前 正号 ,主要是:您在解析数字时没有设置文化。

    该值可能来自不同的位置:它可能来自作为系统默认值的注册表,或者默认值可以由代码设置:
    CultureInfo customCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
    customCulture.NumberFormat = OneIsPositiveSignFormat();
    Thread.CurrentThread.CurrentCulture = customCulture;
    

    关于.net - decimal.TryParse() 丢弃前导 "1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2544099/

    相关文章:

    c# - 用于验证多个值范围的正则表达式 (.NET)

    c# - 如何根据许多选项确定 VAR?

    .net - 使用 .Net 中的 MySql - 许可问题

    c# - 为什么 DateTime.AddDays 舍入到最接近的毫秒数?

    javascript - 如何在 .net 母版页中访问 javascript 变量

    c# - 使用 BinaryReader 逐行读取

    .net - 如何在F#中声明循环依赖的抽象类

    .net - 私有(private)嵌套类

    c# - 我应该为此方法抛出异常吗?

    c# - 我应该将全局常量存储在资源文件 (.resx) 中还是类中?