为什么”1.00-“字符串decimal.Parse()输出是 -1.00?

在 C# 中,decimal 属于数值类型,用于表示精确的十进制数。decimal 类型可以表示非常大或非常小的数字,其范围大致在 -79,228,162,514,264,337,593,543,950,335 到 79,228,162,514,264,337,593,543,950,335 之间。通常我们接触到的数据例如 100.01、1024.55....等等这种数据,但是有个奇怪的现象如果你将"1.00-" 通过decimal.Parse居然能转成功 结果是 -1.00 正常不应该报格式错误嘛?咋回事呢?

通过反编译类库源码我们可以看到当我们使用decimal.Parse(str)时候第二个样式参数它给设定了一个默认值 NumberStyles.Number 那这个又是个啥呢?

官网文档上这么写的我简单翻译一下

 NumberStyles.Number 的组合逻辑

NumberStyles.Number 是一个复合样式,等价于:

NumberStyles.Number = 
    NumberStyles.Integer 
    | NumberStyles.AllowTrailingSign 
    | NumberStyles.AllowDecimalPoint 
    | NumberStyles.AllowThousands 
    | NumberStyles.AllowLeadingWhite 
    | NumberStyles.AllowTrailingWhite 
    | NumberStyles.AllowLeadingSign;
枚举值作用说明
NumberStyles.Integer允许整数格式:纯数字(如 123)、前导 / 末尾空白(如 123 )、前导符号(如 +123 或 -123)。
NumberStyles.AllowTrailingSign允许末尾带符号:数字末尾可以跟 + 或 -(如 123+456-)。
NumberStyles.AllowDecimalPoint允许小数点:字符串中可以包含 .(如 123.45),但不同区域性(Culture)可能是 ,(如 123,45)。
NumberStyles.AllowThousands允许千分位分隔符:字符串中可以包含 ,(如 1,234,不同区域性可能是 .)。
NumberStyles.AllowLeadingWhite允许前导空白:字符串开头可以有空格(如 123)。
NumberStyles.AllowTrailingWhite允许末尾空白:字符串末尾可以有空格(如 123 )。
NumberStyles.AllowLeadingSign允许前导符号:数字开头可以有 + 或 -(如 +123-456)。

总结

也就是说,当你用 decimal.Parse(str, NumberStyles.Number, ...) 时,解析逻辑允许:

  • 前导 / 末尾空白(AllowLeadingWhite/AllowTrailingWhite)。
  • 前导符号(+/- 在开头,AllowLeadingSign)。
  • 末尾符号(+/- 在末尾,AllowTrailingSign)。
  • 小数点(. 或区域性对应的符号,AllowDecimalPoint)。
  • 千分位分隔符(, 或区域性对应的符号,AllowThousands)。

实际影响:为什么 1.00- 能被解析?

回到你的场景,字符串 1.00-

  • 包含小数点(.)→ 符合 AllowDecimalPoint
  • 末尾有 - → 符合 AllowTrailingSign(因为 NumberStyles.Number 包含该枚举)。

所以 .NET 会把 1.00- 解析为 -1.00(把末尾的 - 视为数值的符号),而不是报错 —— 这就是你遇到的 “异常” 解析结果的根本原因。

如果你们有数据要求就按照要求指定格式就可以了 看图

拜拜~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值