是否有一个显示格式化程序,将输出小数作为这些字符串表示在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类型函数将无法在网格中绑定数字列。
是否有一个显示格式化程序,将输出小数作为这些字符串表示在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类型函数将无法在网格中绑定数字列。
您是否需要显示最大小数位数? (你的例子有最多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.#####"));
}
扩展方法:
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
“20.00 - > 2”我认为这不是好行为。修复它调用TrimEnd两次:TrimEnd('0'); TrimEnd( ''); – Vadim 2014-11-27 07:57:47
请勿使用上面编写的代码。 @VadymK是正确的,它的行为是有缺陷的。如果没有周期,它将修剪在该周期之前的尾随零。 – Sevin7 2016-06-24 13:36:13
在stackoverflow上的答案不适用于复制粘贴。它们被用作***学习的来源***。这个sampel代码教你使用'IndexOf'来查找字符串中的字符。调整示例以解决无小数问题很容易。 – jgauffin 2016-06-25 18:44:40
我不认为这是可能外的开箱但像这样一个简单的方法应该这样做
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”=) – jgauffin 2010-06-23 20:31:28
这是很容易做到开箱即用:
Decimal YourValue; //just as example
String YourString = YourValue.ToString().TrimEnd('0','.');
将从您的十进制删除所有尾随零。
您需要做的唯一事情就是将.ToString().TrimEnd('0','.');
添加到十进制变量中,将十进制转换为不带尾随零的字符串,如上例所示。
在一些地区,它应该是一个.ToString().TrimEnd('0',',');
(在那里我们一个逗号,而不是一个点,但你也可以添加一个点和一个逗号作为参数,以确保)
(你也可以同时作为补充参数)
您可能没有意识到这一点,但是在处理'params'参数时,您不必显式构造数组。因此,不用详细的'TrimEnd(“0”.ToCharArray())''你可以只写'TrimEnd('0')'(注意:传递单个'char'而不是'char []')。 – 2010-06-23 19:31:04
@丹涛:谢谢,我忘记了。自从我使用C#以来已经有一段时间了。虽然两个版本都能正常工作,但我编辑了我的帖子 – Mervin 2010-06-23 19:48:11
@Mervin:你需要传递'char',而不是'string'(所以:单引号,而不是双引号)。我为你修好了 - 希望你不介意。 – 2010-06-23 20:01:29
此字符串格式应使您的一天:“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
这是对问题最普遍的答案。不知道为什么这不是十进制的默认“G”格式。尾部零不添加任何信息。 Microsoft文档有一个奇怪的小心警告: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#GFormatString 但是,如果数字是Decimal和精度说明符被省略,总是使用定点表示法并保留尾随零。 – 2017-10-02 23:20:25
我刚刚学会如何正确使用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
这将导致0.00001显示为1E-05,虽然 – sehe 2012-03-03 14:02:57
这是我上面看到的又一个变化。在我的情况下,我需要保留小数点右侧的所有有效数字,意思是在最重要的数字后面全部为零。只是认为这将是很好的分享。虽然我不能保证这一点的效率,但是当试图达到美学效果时,你已经非常无能为力了。
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;
}
就是这样,只是想扔我的两美分。
这很容易是最好的解决方案,它也不会爆炸为“0.0”。我添加了一个默认标志,使整数有选择地显示为“1.0”,这只是使我所有的小数排成一行。无法理解为什么这不是最好的答案,+很多。 – 2014-09-23 15:23:44
如果有人已经向你传递了一个字符串,这特别好。您可以将其更改为ToTrimmedString(此字符串strValue)并删除第一行。 – PRMan 2017-05-24 23:38:07
这是一个很好的观点。我想当我写这篇文章时,我正在处理已经有小数的值,所以我想涵盖整个事情。您可以将该方法的主体放在另一个接受字符串的重载方法内。 – dyslexicanaboko 2017-05-25 20:09:56
decimal val = 0.000000000100m;
string result = val == 0 ? "0" : val.ToString().TrimEnd('0').TrimEnd('.');
而当数字是2000时,这将打印2,所以... – 2015-05-26 08:27:08
谢谢萨米,我刚刚更新了我的解决方案。 – 2015-05-26 13:41:51
另一种解决方案,基于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);
}
我结束了下面的代码:
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;
}
并且你可以随时抛出过高*格式中#个符号的数量。 *不科学 – 2010-06-23 20:43:55
+1 - 顺便说一句,你不需要领先的#。 “0。#####”的功能完全相同。无论哪种方式,这都是从零开始(仅供参考)。 – TrueWill 2010-07-26 22:44:16
谢谢,只是不得不使用这个! – 2011-03-26 00:53:32