C#中的十进制ToString()转换问题

时间:2013-05-15 10:21:11

标签: c# string decimal

当我尝试将decimal?转换为string时,我遇到了问题。场景是

decimal decimalValue = .1211;
string value = (decimalValue * 100).ToString();

当前结果:值= 12.1100

预期结果:值= 12.11

请让我知道,这可能是什么原因。

7 个答案:

答案 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

来自System.Decimal

  

十进制数是一个浮点数   由符号组成的值,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方法透露   应用适当的格式字符串<<。

说明:

  1. 十进制乘法需要转换为十进制,因为Nullable<decimal>.ToString没有格式提供程序
  2. 正如克里斯指出你需要处理Nullable<decimal>null的情况。一种方法是使用Null-Coalescing-Operator

    ((decimal)(decimalValue ?? 0 * 100)).ToString("N2")
    
  3. Jon Skeet的这篇文章值得一读:

    Decimal floating point in .NET(如果您不耐烦,请搜索保留零

答案 1 :(得分:6)

由于您使用Nullable<T>作为decimalNullable<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");

查看Custom Numeric Format Strings

的更多信息

答案 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}}