相关疑难解决方法(0)

decimal.TryParse()删除前导"1"

简短甜美的版本:

在大约一百台测试机器中的一台机器上,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方法有问题.

我们尝试过的事情:

  • 卸载并重新安装客户端应用程序
  • 卸载并重新安装.net 3.5 sp1
  • 将有缺陷的机器的数字区域设置(使用英语(英国))与工作机器的区域设置进行比较 - 没有差异.

有没有人见过这样的东西或有任何建议?我很快就没有想法......


当我输入这个时,会有更多信息传入:将字符串值"10000"传递给Convert.ToInt32()会返回0,所以这似乎也会丢掉前导1.


基于评论的进一步测试:

  • 1.01 - > 0.01 …

.net

15
推荐指数
1
解决办法
969
查看次数

C#将字符串"0"解析为整数

我有一台新的笔记本电脑在工作,本周早些时候工作的代码今天不起作用.

以前工作的代码是简化的:

while (dr.Read())
{
    int i = int.Parse(dr.GetString(1))
}
Run Code Online (Sandbox Code Playgroud)

现在它在数据库值为0时失败.有时,但不可靠,这将起作用:

while (dr.Read())
{
    int i = Convert.ToInt32(dr["FieldName"]))
}
Run Code Online (Sandbox Code Playgroud)

我错过了一些愚蠢的东西吗?

奇怪的是,ReSharper也遇到了大量奇怪的错误,我使用上面的代码得到了相同的错误信息:"输入字符串的格式不正确." (在我加载项目之前开始.)

有任何想法吗?任何有SP问题的人?当我拿到机器时,我确实试图确保所有的SP都是最新的.

编辑:我知道如何使用Try.Parse和错误处理.这里的代码是简化的.我正在从数据库表中读取测试用例.此列仅包含0,1和2值.我已经证实了这一点.我打破了这一点,将数据库字段放入字符串变量s然后尝试int.Parse(s).该代码本周早些时候工作,数据库没有改变.唯一改变的是我的环境.

为了完全简化问题,这行代码抛出异常("输入字符串格式不正确"):

 int.Parse("0");
Run Code Online (Sandbox Code Playgroud)

编辑:感谢大家帮我解决这个问题!解决方案是强制重置我的语言设置.

c#

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

.net ×1

c# ×1