
在 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(把末尾的 - 视为数值的符号),而不是报错 —— 这就是你遇到的 “异常” 解析结果的根本原因。
如果你们有数据要求就按照要求指定格式就可以了 看图

拜拜~
C#中decimal.Parse解析“1.00-”为 -1.00原因
1507

被折叠的 条评论
为什么被折叠?



