有谁知道一种仅获取数字小数部分的优雅方法?特别是我希望得到小数点后的确切位数,以便可以适当地格式化数字。我想知道是否可以在不使用文化特定小数分隔符进行任何类型的字符串提取的情况下执行此操作....
例如
98.0 将被格式化为 98
98.20 将被格式化为 98.2
98.2765 将被格式化为 98.2765 等等。
它仅用于格式化目的ToString
,我猜只是调用就可以了?
double d = (double)5 / 4;
Console.WriteLine(d.ToString()); // prints 1.75
d = (double)7 / 2;
Console.WriteLine(d.ToString()); // prints 3.5
d = 7;
Console.WriteLine(d.ToString()); // prints 7
当然,这将根据当前文化格式化数字(这意味着小数点符号、千位分隔符等会有所不同)。
更新
正如克莱门特 H 在评论中指出的那样;如果我们正在处理大量数字,在某些时候 d.ToString() 将返回一个具有科学格式的字符串(例如"1E+16"
代替"10000000000000000"
)。克服此问题并强制打印完整数字的一种方法是使用d.ToString("0.#")
,这也将导致与上面的代码示例产生的较低数字相同的输出。
假设您真正的意思是,您可以从Decimal.GetBits方法获取所有相关信息System.Decimal
。(如果您谈论的是浮点数/双精度数的十进制格式,请澄清问题。)
基本上GetBits
会在一个数组中返回 4 个整数。
您可以使用比例因子(屏蔽符号后的第四个整数)来指示小数位数,但您应该注意,它不一定是有效小数位数。特别是1和1.0的十进制表示是不同的(前者是1/1,后者是10/10)。
不幸的是,除非您可以使用 .NET 4.0 和BigInteger
.
老实说,通过使用内置格式,您将获得一个更简单CultureInfo.InvariantCulture
的解决方案,然后找到“。”右侧的所有内容。
Just to expand on the point about getbits, this expression gets the scaling factor from a decimal called foo:
(decimal.GetBits(foo)[3] & 16711680)>>16
You could use the Int() function to get the whole number component, then subtract from the original.