简短甜美的版本:
在大约一百台测试机器中的一台机器上,decimal.TryParse()将"1.01"转换为0.01
好吧,这听起来很疯狂,但请耐心等待......
我们有一个通过JSON与Web服务通信的客户端应用程序,该服务返回一个十进制值作为字符串,因此我们将它作为字符串存储在我们的模型对象中:
[DataMember(Name = "value")]
public string Value { get; set; }
Run Code Online (Sandbox Code Playgroud)
当我们在屏幕上显示该值时,它被格式化为特定的小数位数.所以我们使用的过程是字符串 - >十进制,然后十进制 - >字符串.
该应用程序目前正在进行最终测试,并在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;
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上 - 任何其他客户端机器 - 日志文件输出是:
- 原始字符串值:1.010000
- 经验证的十进制值:1.010000
- 格式化字符串值:1.01
在有缺陷的机器上输出是:
- 原始字符串值:1.010000
- 经解析的十进制值:0.010000
- 格式化字符串值:0.01
所以看起来decimal.TryParse方法有问题.
我们尝试过的事情:
有没有人见过这样的东西或有任何建议?我很快就没有想法......
当我输入这个时,会有更多信息传入:将字符串值"10000"传递给Convert.ToInt32()会返回0,所以这似乎也会丢掉前导1.
基于评论的进一步测试:
因此它似乎只影响1,并且只有它们是字符串的第一个字符.很奇怪,但至少它是一致的.
Kob*_*obi 16
我能够重现你的结果.考虑:
public NumberFormatInfo OneIsPositiveSignFormat()
{
NumberFormatInfo custom = new NumberFormatInfo();
custom.PositiveSign = "1";
return custom;
}
Run Code Online (Sandbox Code Playgroud)
然后:
if (decimal.TryParse(value, NumberStyles.Number, OneIsPositiveSignFormat(), out val))
Run Code Online (Sandbox Code Playgroud)
问题是:区域设置不会显示当前的正号,主要是:解析数字时没有设置文化.
该值可能来自不同的位置:它可能来自注册表,因为系统默认,或者默认值可能由代码设置:
CultureInfo customCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
customCulture.NumberFormat = OneIsPositiveSignFormat();
Thread.CurrentThread.CurrentCulture = customCulture;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
969 次 |
| 最近记录: |