【发布时间】:2012-11-08 18:50:22
【问题描述】:
我想知道是否有一种简洁准确的方法来提取十进制值(作为 int)中的小数位数,以便在不同的文化信息中安全使用?
例如:
19.0 应该返回 1,
27.5999 应该返回 4,
19.12 应该返回 2,
等等
我写了一个查询,它对句点进行字符串拆分以查找小数位:
int priceDecimalPlaces = price.ToString().Split('.').Count() > 1
? price.ToString().Split('.').ToList().ElementAt(1).Length
: 0;
但我突然想到,这仅适用于使用“。”的地区。作为小数分隔符,因此在不同系统中非常脆弱。
【问题讨论】:
-
根据问题标题的小数
-
Split 之前的一些模式匹配怎么样?基本上 \d+(\D)\d+ 其中 \D 返回分隔符(. 等)
-
这不是一个封闭式的问题,因为它乍一看可能会出现。要求
19.0返回1是关于值19.0的内部存储的实现细节。事实上,程序将其存储为190×10⁻¹或1900×10⁻²或19000×10⁻³是完全合法的。所有这些都是平等的。事实上,它在给定19.0M的值时使用第一个表示,而在没有格式说明符的情况下使用ToString时会暴露这一点,这只是一个巧合,也是一件快乐的事情。除非人们在不应该依赖指数的情况下依赖指数,这并不令人高兴。 -
如果你想要一个在创建时可以携带“使用的小数位数”的类型,以便可靠地区分
19M和19.0M和19.00M,你需要创建一个新类,将基础值捆绑为一个属性,将小数位数捆绑为另一个属性。 -
即使 Decimal 类可以“区分” 19m、19.0m 和 19.00m?有效数字就像它的主要用例之一。 19.0m * 1.0m 是多少?似乎是说 19.00m,也许 C# 开发人员做错了数学:P?同样,有效数字是真实的。如果您不喜欢有效数字,您可能不应该使用 Decimal 类。
标签: c# decimal cultureinfo