当我尝试将decimal?
转换为string
时,我遇到了问题。场景是
decimal decimalValue = .1211;
string value = (decimalValue * 100).ToString();
当前结果:值= 12.1100
预期结果:值= 12.11
请让我知道,这可能是什么原因。
答案 0 :(得分:20)
Decimal
会在Decimal
个数字中保留任何尾随零。如果你想要两个小数位:
decimal? decimalValue = .1211m;
string value = ((decimal)(decimalValue * 100)).ToString("#.##")
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
或
string value = ((decimal)(decimalValue * 100)).ToString("N2")
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
十进制数是一个浮点数 由符号组成的值,a 数字值中的每个数字 值的范围是0到9, a 缩放因子,表示 浮动小数点的位置 分隔积分和 数值的小数部分。
十进制的二进制表示 值由1位符号组成 96位整数,以及缩放 用于分割96位的因子 整数并指定它的哪个部分 是小数部分。缩放 因素是隐含的数字10, 提升到0的指数 到28.因此,二进制 十进制值的表示是 形式,(( - 2 96 至2 96 )/ 10 (0至 28)),其中-2 96 -1等于 MinValue和2 96 -1等于 MaxValue的。
缩放系数也会保留任何缩放系数 以十进制数表示尾随零。 尾随零不会影响 一个十进制数的值 算术或比较操作。 但是,>>尾随零可以 如果一个ToString方法透露 应用适当的格式字符串<<。
说明:
Nullable<decimal>.ToString
没有格式提供程序正如克里斯指出你需要处理Nullable<decimal>
为null
的情况。一种方法是使用Null-Coalescing-Operator
:
((decimal)(decimalValue ?? 0 * 100)).ToString("N2")
Jon Skeet的这篇文章值得一读:
Decimal floating point in .NET(如果您不耐烦,请搜索保留零)
答案 1 :(得分:6)
由于您使用Nullable<T>
作为decimal
,Nullable<T>.ToString()
方法没有重载,因此可以使用参数进行格式化。
您可以明确地将其强制转换为decimal
,而不是使用.ToString()
方法进行格式化。
只需在"0.00"
方法中使用.ToString()
格式。
decimal? decimalValue = .1211M;
string value = ((decimal)(decimalValue * 100)).ToString("0.00");
Console.WriteLine(value);
输出将是;
12.11
这是DEMO
。
作为替代方案,您可以在没有任何对话的情况下使用Nullable<T>.Value
;
string value = (decimalValue * 100).Value.ToString("0.00");
的更多信息
答案 2 :(得分:2)
或者,您可以指定格式“F2”,如下所示:string val = decVal.ToString("F2")
,因为它指定2个小数位。
答案 3 :(得分:2)
使用fixed-point ("F) format specifier。
string value = (decimalValue * 100).ToString("F");
默认精度说明符基于 NumberFormatInfo.NumberDecimalDigits 属性的值,默认值为2.因此,如果不指定数字aftyer“F”,则默认情况下指定两位小数
F0 - No decimal places
F1 - One decimal place
答案 4 :(得分:1)
如果您不想限制为一定数量的十进制数字:
decimal? decimalValue = .1211;
string value = decimalValue == null
? "0"
: decimalValue == 0
? "0"
: (decimalValue * 100).ToString().TrimEnd('0');
这会修剪字符串的任何(如果有的话)尾随零,并返回&#34; 0&#34;如果decimalValue
为空。如果该值为0,那么&#34; 0&#34;没有修剪就退回了。
答案 5 :(得分:0)
String.Format("{0:0.00}", decimalValue * 100);
您可以使用.Format()
替代.ToString("0.00"
)。
答案 6 :(得分:0)
由于decimal?
没有ToString(string format)
重载,最简单的方法是使用String.Format
代替null
decimalValue
string value = String.Format("{0:#.##}", decimalValue * 100);
的情况与原始代码相比,也是(导致空字符串):
0.001211
但是对于其他你不清楚的数字还有其他一些考虑因素。
如果您的数字不会产生大于0的值,它是否显示前导零?也就是说,对于0.12
,它是显示为.12
还是#.##
?如果您想要前导零,请改用它(注意从0.##
到string value = String.Format("{0:0.##}", decimalValue * 100);
的更改):
.12113405
如果您有超过2个有效小数位,是否要显示这些?因此,如果您有12.113405
,它会显示为string value = String.Format("{0:#.############}", decimalValue * 100);
吗?如果是这样,请使用:
string value = String.Format("{0:0.############}", decimalValue * 100);
(老实说,我认为必须有一个更好的格式化字符串,特别是因为它只支持12位小数)
当然,如果你想要前导零和多个小数位,只需要结合上面两个:
{{1}}