删除尾部的零?
显示原文与译文双语对照的内容

0 0

我将一些字段作为集合返回

 
2.4200
2.0044
2.0000

 

我想要这样的结果

 
2.42
2.0044
2

 

我尝试了字符串。格式,但它返回 2.000 0,并将它的设置为不舍入其他值。

编辑:

虽然我把它标记为答案,但对哪个选择有点迷惑。 Fasih确实提供了一个很酷的解决方案。 如果版主知道哪些是最合适的技术,他们可以标记。

时间: 原作者: 17个回答

0 0

如果输入是一个字符串,那么它是不是像这样简单? 你可以使用以下之一:


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

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

2.0m.ToString("G29")


这应该适用于所有输入。

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

但是,如果数字为十进制,并且省略了精度说明符,则总是使用fixed-point表示法,并且保留尾随零

更新 Konrad 指出注释中的:

注意如 0.000 001的值。 G29格式将以尽可能短的方式呈现它们,因此它将 switch 用于指数表示法。 string.Format("{0:G29}", decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-US"))) 将" 1e-08"作为结果。

原作者:
0 0

我遇到了同样的问题,但在这种情况下,我没有控制到字符串的输出,由一个库负责处理。 在查看了十进制类型( 参见 http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx web )的实现细节之后,我得到了一个简洁的技巧( 这里作为一个扩展方法):


public static decimal Normalize(this decimal value)
{
 return value/1.000000000000000000000000000000000m;
}


小数的指数部分被缩减为需要的。 在输出十进制调用 ToString() 将写入不带任何尾随 0的数字。 E.g.


1.200m.Normalize().ToString();


原作者:
0 0

我认为使用自定义数字格式字符串更安全。


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


原作者:
0 0

这完全是你所需要的:

如果你的初始值为 decimal:


decimal source = 2.4200m;
string output = ((double)source).ToString();


如果你的初始值为 string:


string source ="2.4200";
string output = double.Parse(source).ToString();


并且应该花费最低的性能。

原作者:
0 0

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

基本基本

十进制 v=2.4200m ;

v.ToString("#.######");//将返回 2.42. #的数字是你支持多少位数的数字。

原作者:
0 0

取决于你的数字代表什么以及你想要如何管理值: 是货币,你需要舍入或者截断你是否需要这里舍入才能显示?

如果显示为 ,则为显示数字为 x.ToString("")

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

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

如果它只是需要一个MidPointRounding舍入,请使用 Math.Round 过载,过载

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

如果从数据库中获取值,请考虑转换而不是转换: double值= ( 十进制) myRecord ["columnName"] ;

原作者:
0 0

非常低级的方法,但我相信这将是最高性能的方法,只使用快速整数计算( 并且没有缓慢的字符串解析和区域性敏感方法):


public static decimal Normalize(this decimal d)
{
 int[] bits = decimal.GetBits(d);

 int sign = bits[3] & (1 <<31);
 int exp = (bits[3]>> 16) & 0x1f;

 uint a = (uint)bits[2];//Top bits
 uint b = (uint)bits[1];//Middle bits
 uint c = (uint)bits[0];//Bottom bits

 while (exp> 0 && ((a % 5) * 6 + (b % 5) * 6 + c) % 10 == 0)
 {
 uint r;
 a = DivideBy10((uint)0, a, out r);
 b = DivideBy10(r, b, out r);
 c = DivideBy10(r, c, out r);
 exp--;
 }

 bits[0] = (int)c;
 bits[1] = (int)b;
 bits[2] = (int)a;
 bits[3] = (exp <<16) | sign;
 return new decimal(bits);
}

private static uint DivideBy10(uint highBits, uint lowBits, out uint remainder)
{
 ulong total = highBits;
 total <<= 32;
 total = total | (ulong)lowBits;

 remainder = (uint)(total % 10L);
 return (uint)(total/10L);
}


原作者:
0 0

截断尾随零非常简单,通过双面转换解决:


 decimal mydecimal = decimal.Parse("1,45000000");//(I)
 decimal truncate = (decimal)(double)mydecimal;//(II)


( I ) --> 从任意字符串源解析十进制值。

( II ) --> : 转换为double这将删除尾随零。 第二个:由于不存在十进制转换为double和 viceversa,其他类型转换为十进制

原作者:
0 0

请尝试以下代码:


string value ="100";
value = value.Contains(".")? value.TrimStart('0').TrimEnd('0').TrimEnd('.') : value.TrimStart('0');


原作者:
0 0

使用哈希( # ) 符号只在必要时显示尾随 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%


原作者:
...