简短而甜蜜的版本:
在大约一百台测试机器中的一台机器上,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 方法似乎有问题。
我们尝试过的事情:
有没有人见过这样的事情或有什么建议?我很快就没有想法了...
当我输入这个时,一些更多的信息进来了:将字符串值“10000”传递给 Convert.ToInt32() 返回 0,所以这似乎也去掉了前导 1。
基于评论的进一步测试:
因此,它似乎只影响 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/