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

Pus*_*kar 16 c# string decimal

我面临的一个问题,当我尝试转换decimal?string.情景是

decimal decimalValue = .1211;
string value = (decimalValue * 100).ToString();
Run Code Online (Sandbox Code Playgroud)

当前结果:值= 12.1100

预期结果:值= 12.11

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

Tim*_*ter 21

Decimal保留数字中的任何尾随零Decimal.如果你想要两个小数位:

decimal? decimalValue = .1211m;
string value = ((decimal)(decimalValue * 100)).ToString("#.##")
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

要么

string value = ((decimal)(decimalValue * 100)).ToString("N2")
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

来自System.Decimal:

十进制数是一个浮点值,由一个符号,一个数值组成,其中值中的每个数字范围从0到9,以及一个缩放系数,表示浮动小数点的位置,用于分隔积分和小数部分的数值.

Decimal值的二进制表示由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")
    
    Run Code Online (Sandbox Code Playgroud)

Jon Skeet的这篇文章值得一读:

.NET中的十进制浮点数(如果你不耐烦的话,可以保留零)


Son*_*nül 6

由于您使用Nullable<T>as decimal,Nullable<T>.ToString()方法没有重载,因此可以使用参数进行格式化.

而不是,您可以显式地将其转换为decimal,您可以使用.ToString()方法进行格式化.

只需"0.00"在您的.ToString()方法中使用格式.

decimal? decimalValue = .1211M;
string value = ((decimal)(decimalValue * 100)).ToString("0.00");
Console.WriteLine(value);
Run Code Online (Sandbox Code Playgroud)

输出将是;

12.11
Run Code Online (Sandbox Code Playgroud)

这是一个DEMO.

作为替代方案,您可以在Nullable<T>.Value没有任何对话的情况下使用;

string value = (decimalValue * 100).Value.ToString("0.00");
Run Code Online (Sandbox Code Playgroud)

查看更多信息 Custom Numeric Format Strings