删除尾随零

Zo *_*Has 160 .net c# decimal

我有一些集合返回的字段为

2.4200
2.0044
2.0000
Run Code Online (Sandbox Code Playgroud)

我想得到的结果

2.42
2.0044
2
Run Code Online (Sandbox Code Playgroud)

我尝试过String.Format,但它返回2.0000并将其设置为N0舍入其他值.

Tho*_*rna 183

我遇到了同样的问题,但是在我无法控制输出到字符串的情况下,这是由库来处理的.在查看Decimal类型的实现细节之后(参见http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx),我想出了一个巧妙的技巧(这里作为扩展)方法):

public static decimal Normalize(this decimal value)
{
    return value/1.000000000000000000000000000000000m;
}
Run Code Online (Sandbox Code Playgroud)

十进制的指数部分减少到所需的数量.在输出小数上调用ToString()将写入数字而不会有任何尾随0.例如

1.200m.Normalize().ToString();
Run Code Online (Sandbox Code Playgroud)

  • 这个答案拥有,因为基本上不同于这个问题(甚至整个主题)的其他答案实际上是工作,并做OP所要求的. (25认同)
  • 它接缝"值/ 1M"已经有效. (4认同)
  • MSDN声明"缩放因子隐式为数字10,从0到28指数",我理解为十进制数最多只能有小数点后的28位数.任意数量的零> = 28都应该有效. (3认同)
  • 0是这里的确切数量的数量还是仅仅涵盖大多数预期值? (2认同)
  • 这是最好的答案!答案中的数字有34个数字,`1`后跟33` 0`-s,但是它创建了与29个数字完全相同的`decimal`实例,一个`1`和28` 0`-s .就像@ThomasMaterna在评论中所说的那样.没有`System.Decimal`可以有超过29个数字(前导数字大于'79228 ......的数字总共只有*28*数字).如果你想要***更多***尾随零,乘以`1.000 ... m`而不是分割.另外,`Math.Round`可以切掉一些零,例如`Math.Round(27.40000m,2)`给出'27.40m`,所以只留下一个零. (2认同)
  • 很棒的技巧,但不适用于Mono,并且不能保证在.NET的功能版本上工作 (2认同)

Dog*_*ars 154

如果输入是一个字符串,它不是这么简单吗?您可以使用以下方法之一:

string.Format("{0:G29}", decimal.Parse("2.0044"))

decimal.Parse("2.0044").ToString("G29")

2.0m.ToString("G29")
Run Code Online (Sandbox Code Playgroud)

这适用于所有输入.

更新检查标准数字格式我必须明确地将精度说明符设置为29,因为文档清楚地说明:

但是,如果数字是十进制并且省略精度说明符,则始终使用定点表示法并保留尾随零

更新 康拉德 在评论中指出:

注意像0.000001这样的值.G29格式将以最短的方式呈现它们,因此它将切换到指数表示法.string.Format("{0:G29}", decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-US")))将给出"1E-08"作为结果.

  • 注意像0.000001这样的值.G29格式将以最短的方式呈现它们,因此它将切换到指数表示法.string.Format("{0:G29}",decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-US")))将给出"1E-08"作为结果 (16认同)
  • @Konrad - 对于有5或6位小数的数字,有没有办法避免使用科学记数法? (15认同)
  • var d = 2.0m; d.ToString( "G"); (4认同)
  • @Dave Hillier - 我明白了,我已经纠正了我的回答.干杯.[添加明确的'精确说明符'] (3认同)
  • 请注意,`"G0"` 的工作方式与 `"G29"` 类似,因为如上所述,当精度说明符为零时,将使用该类型的默认精度(对于 `decimal` 为 29)。 (2认同)

Mic*_*aga 83

在我看来,使用自定义数字格式字符串更安全.

decimal d = 0.00000000000010000000000m;
string custom = d.ToString("0.#########################");
// gives: 0,0000000000001
string general = d.ToString("G29");
// gives: 1E-13
Run Code Online (Sandbox Code Playgroud)

  • +1是唯一依赖稳定记录行为的答案. (24认同)
  • 你应该把那些28'#'字符放在那里,参见http://www.blackwasp.co.uk/DecimalTrailingZeroes.aspx. (2认同)

小智 29

我使用此代码来避免"G29"科学记数法:

public static string DecimalToString(decimal dec)
{
    string strdec = dec.ToString(CultureInfo.InvariantCulture);
    return strdec.Contains(".") ? strdec.TrimEnd('0').TrimEnd('.') : strdec;
}
Run Code Online (Sandbox Code Playgroud)

  • 很好,但它不适用于使用逗号作为小数分隔符的文化.你需要使用`Culture.NumberFormat.NumberDecimalSeparator` (9认同)

Fiz*_*zix 14

使用hash(#)符号仅在必要时显示尾随0.请参阅下面的测试.

decimal num1 = 13.1534545765;
decimal num2 = 49.100145;
decimal num3 = 30.000235;

num1.ToString("0.##");       //13.15%
num2.ToString("0.##");       //49.1%
num3.ToString("0.##");       //30%
Run Code Online (Sandbox Code Playgroud)

  • 不是答案.您没有删除尾随零,您正在删除精度.你提出的方法`num1.ToString("0.##")`应该返回`13.1534545765`(没有变化),因为没有任何尾随零. (7认同)
  • 这就是为什么我要显示我提出的三个输入的答案,以便用户可以看到我的解决方案是如何工作的。 (2认同)
  • 如果可以的话,我可以投票10次。正是我需要的! (2认同)

DHo*_*out 10

我找到了一个优雅的解决方案来自http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/

基本上

十进制v = 2.4200M;

v.ToString( "#######"); //将返回2.42.#的数量是您支持的十进制数.

  • 是.它应该是"0.########". (2认同)

小智 5

这很简单。

decimal decNumber = Convert.ToDecimal(value);
        return decNumber.ToString("0.####");
Run Code Online (Sandbox Code Playgroud)

已测试。

干杯:)