繁体   English   中英

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

[英]Decimal ToString() conversion issue in C#

我尝试转换decimal?时遇到问题decimal? string 情景是

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

当前结果:值= 12.1100

预期结果:值= 12.11

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

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

十进制数是一个浮点值,由一个符号,一个数值组成,其中值中的每个数字范围从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. 正如Chris指出你需要处理Nullable<decimal>null 一种方法是使用Null-Coalescing-Operator

     ((decimal)(decimalValue ?? 0 * 100)).ToString("N2") 

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

.NET中的十进制浮点数 (如果你不耐烦的话,用于保持零

由于您使用Nullable<T>作为decimal ,因此Nullable<T>.ToString()方法没有使用可用于格式化的参数的重载。

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

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

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更多信息

或者,您可以指定格式“F2”,如下所示: string val = decVal.ToString("F2")因为它指定2个小数位。

使用定点(“F)格式说明符

   string value = (decimalValue * 100).ToString("F");

默认精度说明符基于NumberFormatInfo.NumberDecimalDigits属性的值,默认值为2.因此,如果不指定数字aftyer“F”,则默认情况下指定两个十进制数字。

F0 - No decimal places
F1 - One decimal place

如果您不想限制为一定数量的十进制数字:

decimal? decimalValue = .1211;
string value = decimalValue == null 
               ? "0"
               : decimalValue == 0
               ? "0"
               : (decimalValue * 100).ToString().TrimEnd('0');

这将修剪字符串的任何(如果有)尾随零,如果decimalValue为null,则返回“0”。 如果该值为0,则返回“0”而不进行修剪。

String.Format("{0:0.00}", decimalValue * 100);

您可以使用.Format()替代.ToString("0.00" )。

decimal? 没有ToString(string format)重载,最简单的方法是使用String.Format ,它与decimalValuenull case一起提供一致的结果(导致空字符串)与原始代码相比:

string value = String.Format("{0:#.##}", decimalValue * 100);

但是对于其他您不清楚的数字还有其他一些考虑因素。

如果您的数字不会产生大于0的值,它是否显示前导零? 也就是说,对于0.001211 ,它是显示为0.12还是.12 如果你想要前导零,请改用它(注意从#.##0.##的变化0.## ):

string value = String.Format("{0:0.##}", decimalValue * 100);

如果您有超过2个有效小数位,是否要显示这些? 所以如果你有.12113405它会显示为12.113405吗? 如果是这样使用:

string value = String.Format("{0:#.############}", decimalValue * 100);

(老实说,我认为必须有一个比这更好的格式化字符串,特别是因为它只支持12位小数)

当然,如果你想要前导零多个小数位,只需要结合上面两个:

string value = String.Format("{0:0.############}", decimalValue * 100);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM