2010-06-23 67 views
77

是否有一个显示格式化程序,将输出小数作为这些字符串表示在C#中没有做任何舍入?最好的方式来显示小数没有尾随零

// decimal -> string 

20 -> 20 
20.00 -> 20 
20.5 -> 20.5 
20.5000 -> 20.5 
20.125 -> 20.125 
20.12500 -> 20.125 
0.000 -> 0 

{0#}将舍入,并且使用某些Trim类型函数将无法在网格中绑定数字列。

回答

111

您是否需要显示最大小数位数? (你的例子有最多5个)。

如果是这样,我会认为格式为“0。#####”会做你想做的。

static void Main(string[] args) 
    { 
     var dList = new decimal[] { 20, 20.00m, 20.5m, 20.5000m, 20.125m, 20.12500m, 0.000m }; 

     foreach (var d in dList) 
      Console.WriteLine(d.ToString("0.#####")); 
    } 
+4

并且你可以随时抛出过高*格式中#个符号的数量。 *不科学 – 2010-06-23 20:43:55

+2

+1 - 顺便说一句,你不需要领先的#。 “0。#####”的功能完全相同。无论哪种方式,这都是从零开始(仅供参考)。 – TrueWill 2010-07-26 22:44:16

+0

谢谢,只是不得不使用这个! – 2011-03-26 00:53:32

4

扩展方法:

public static class Extensions 
{ 
    public static string TrimDouble(this string temp) 
    { 
     var value = temp.IndexOf('.') == -1 ? temp : temp.TrimEnd('.', '0'); 
     return value == string.Empty ? "0" : value; 
    } 
} 

示例代码:

double[] dvalues = {20, 20.00, 20.5, 20.5000, 20.125, 20.125000, 0.000}; 
foreach (var value in dvalues) 
    Console.WriteLine(string.Format("{0} --> {1}", value, value.ToString().TrimDouble())); 

Console.WriteLine("=================="); 

string[] svalues = {"20", "20.00", "20.5", "20.5000", "20.125", "20.125000", "0.000"}; 
foreach (var value in svalues) 
    Console.WriteLine(string.Format("{0} --> {1}", value, value.TrimDouble())); 

输出:

20 --> 20 
20 --> 20 
20,5 --> 20,5 
20,5 --> 20,5 
20,125 --> 20,125 
20,125 --> 20,125 
0 --> 0 
================== 
20 --> 20 
20.00 --> 2 
20.5 --> 20.5 
20.5000 --> 20.5 
20.125 --> 20.125 
20.125000 --> 20.125 
0.000 --> 0 
+1

“20.00 - > 2”我认为这不是好行为。修复它调用TrimEnd两次:TrimEnd('0'); TrimEnd( ''); – Vadim 2014-11-27 07:57:47

+2

请勿使用上面编写的代码。 @VadymK是正确的,它的行为是有缺陷的。如果没有周期,它将修剪在该周期之前的尾随零。 – Sevin7 2016-06-24 13:36:13

+1

在stackoverflow上的答案不适用于复制粘贴。它们被用作***学习的来源***。这个sampel代码教你使用'IndexOf'来查找字符串中的字符。调整示例以解决无小数问题很容易。 – jgauffin 2016-06-25 18:44:40

1

我不认为这是可能外的开箱但像这样一个简单的方法应该这样做

public static string TrimDecimal(decimal value) 
{ 
    string result = value.ToString(System.Globalization.CultureInfo.InvariantCulture); 
    if (result.IndexOf('.') == -1) 
     return result; 

    return result.TrimEnd('0', '.'); 
} 
+0

将无法​​使用“0.0”=) – jgauffin 2010-06-23 20:31:28

3

这是很容易做到开箱即用:

Decimal YourValue; //just as example 
String YourString = YourValue.ToString().TrimEnd('0','.'); 

将从您的十进制删除所有尾随零。

您需要做的唯一事情就是将.ToString().TrimEnd('0','.');添加到十进制变量中,将十进制转换为不带尾随零的字符串,如上例所示。

在一些地区,它应该是一个.ToString().TrimEnd('0',',');(在那里我们一个逗号,而不是一个点,但你也可以添加一个点和一个逗号作为参数,以确保)

(你也可以同时作为补充参数)

+0

您可能没有意识到这一点,但是在处理'params'参数时,您不必显式构造数组。因此,不用详细的'TrimEnd(“0”.ToCharArray())''你可以只写'TrimEnd('0')'(注意:传递单个'char'而不是'char []')。 – 2010-06-23 19:31:04

+0

@丹涛:谢谢,我忘记了。自从我使用C#以来已经有一段时间了。虽然两个版本都能正常工作,但我编辑了我的帖子 – Mervin 2010-06-23 19:48:11

+0

@Mervin:你需要传递'char',而不是'string'(所以:单引号,而不是双引号)。我为你修好了 - 希望你不介意。 – 2010-06-23 20:01:29

14

此字符串格式应使您的一天:“0。#############################”。请记住,小数尽管可以有至多29个有效数字。

例子:

? (1000000.00000000000050000000000m).ToString("0.#############################") 
-> 1000000.0000000000005 

? (1000000.00000000000050000000001m).ToString("0.#############################") 
-> 1000000.0000000000005 

? (1000000.0000000000005000000001m).ToString("0.#############################") 
-> 1000000.0000000000005000000001 

? (9223372036854775807.0000000001m).ToString("0.#############################") 
-> 9223372036854775807 

? (9223372036854775807.000000001m).ToString("0.#############################") 
-> 9223372036854775807.000000001 
+0

这是对问题最普遍的答案。不知道为什么这不是十进制的默认“G”格式。尾部零不添加任何信息。 Microsoft文档有一个奇怪的小心警告: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#GFormatString 但是,如果数字是Decimal和精度说明符被省略,总是使用定点表示法并保留尾随零。 – 2017-10-02 23:20:25

18

我刚刚学会如何正确使用G格式说明。请参阅MSDN Documentation。有一点注释说明,当没有指定精度时,尾随零将保留为十进制类型。为什么他们会这样做,我不知道,但指定我们的精度的最大数字位数应该解决这个问题。所以对于格式化小数,G29是最好的选择。

decimal test = 20.5000m; 
test.ToString("G"); // outputs 20.5000 like the documentation says it should 
test.ToString("G29"); // outputs 20.5 which is exactly what we want 
+14

这将导致0.00001显示为1E-05,虽然 – sehe 2012-03-03 14:02:57

7

这是我上面看到的又一个变化。在我的情况下,我需要保留小数点右侧的所有有效数字,意思是在最重要的数字后面全部为零。只是认为这将是很好的分享。虽然我不能保证这一点的效率,但是当试图达到美学效果时,你已经非常无能为力了。

public static string ToTrimmedString(this decimal target) 
{ 
    string strValue = target.ToString(); //Get the stock string 

    //If there is a decimal point present 
    if (strValue.Contains(".")) 
    { 
     //Remove all trailing zeros 
     strValue = strValue.TrimEnd('0'); 

     //If all we are left with is a decimal point 
     if (strValue.EndsWith(".")) //then remove it 
      strValue = strValue.TrimEnd('.'); 
    } 

    return strValue; 
} 

就是这样,只是想扔我的两美分。

+1

这很容易是最好的解决方案,它也不会爆炸为“0.0”。我添加了一个默认标志,使整数有选择地显示为“1.0”,这只是使我所有的小数排成一行。无法理解为什么这不是最好的答案,+很多。 – 2014-09-23 15:23:44

+1

如果有人已经向你传递了一个字符串,这特别好。您可以将其更改为ToTrimmedString(此字符串strValue)并删除第一行。 – PRMan 2017-05-24 23:38:07

+0

这是一个很好的观点。我想当我写这篇文章时,我正在处理已经有小数的值,所以我想涵盖整个事情。您可以将该方法的主体放在另一个接受字符串的重载方法内。 – dyslexicanaboko 2017-05-25 20:09:56

1
decimal val = 0.000000000100m; 
string result = val == 0 ? "0" : val.ToString().TrimEnd('0').TrimEnd('.'); 
+3

而当数字是2000时,这将打印2,所以... – 2015-05-26 08:27:08

+1

谢谢萨米,我刚刚更新了我的解决方案。 – 2015-05-26 13:41:51

3

另一种解决方案,基于dyslexicanaboko's答案,但独立于当前的文化:

public static string ToTrimmedString(this decimal num) 
{ 
    string str = num.ToString(); 
    string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; 
    if (str.Contains(decimalSeparator)) 
    { 
     str = str.TrimEnd('0'); 
     if(str.EndsWith(decimalSeparator)) 
     { 
      str = str.RemoveFromEnd(1); 
     } 
    } 
    return str; 
} 

public static string RemoveFromEnd(this string str, int characterCount) 
{ 
    return str.Remove(str.Length - characterCount, characterCount); 
} 
0

我结束了下面的代码:

public static string DropTrailingZeros(string test) 
    { 
     if (test.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)) 
     { 
      test = test.TrimEnd('0'); 
     } 

     if (test.EndsWith(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)) 
     { 
      test = test.Substring(0, 
       test.Length - CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator.Length); 
     } 

     return test; 
    } 
相关问题