我有一些由集合返回的字段
2.4200
2.0044
2.0000
我想要这样的结果
2.42
2.0044
2
我试过用String。格式,但它返回2.0000,并将其设置为N0也会四舍五入其他值。
我有一些由集合返回的字段
2.4200
2.0044
2.0000
我想要这样的结果
2.42
2.0044
2
我试过用String。格式,但它返回2.0000,并将其设置为N0也会四舍五入其他值。
当前回答
像这样试试
string s = "2.4200";
s = s.TrimStart("0").TrimEnd("0", ".");
然后把它转换成浮点数
其他回答
像这样试试
string s = "2.4200";
s = s.TrimStart("0").TrimEnd("0", ".");
然后把它转换成浮点数
我遇到了同样的问题,但在我无法控制输出到字符串的情况下,这是由库处理的。在详细了解了Decimal类型的实现(参见http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx)后, 我想出了一个巧妙的技巧(这里是一个扩展方法):
public static decimal Normalize(this decimal value)
{
return value/1.000000000000000000000000000000000m;
}
小数点的指数部分被缩减为所需的部分。对输出小数调用ToString()将写入不带任何0的数字。如。
1.200m.Normalize().ToString();
我使用这个代码来避免“G29”科学符号:
public static string DecimalToString(this decimal dec)
{
string strdec = dec.ToString(CultureInfo.InvariantCulture);
return strdec.Contains(".") ? strdec.TrimEnd('0').TrimEnd('.') : strdec;
}
编辑:使用系统CultureInfo.NumberFormat.NumberDecimalSeparator:
public static string DecimalToString(this decimal dec)
{
string sep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
string strdec = dec.ToString(CultureInfo.CurrentCulture);
return strdec.Contains(sep) ? strdec.TrimEnd('0').TrimEnd(sep.ToCharArray()) : strdec;
}
如果输入是一个字符串,它不是这么简单吗?你可以使用其中一个:
string.Format("{0:G29}", decimal.Parse("2.0044"))
decimal.Parse("2.0044").ToString("G29")
2.0m.ToString("G29")
这应该适用于所有输入。
我必须显式地将精度说明符设置为29,因为文档清楚地声明:
但是,如果数字是Decimal且省略了精度说明符,则始终使用定点表示法并保留后面的零
Konrad在评论中指出:
注意像0.000001这样的值。G29格式将以最短的方式表示它们,因此它将切换到指数符号。字符串。Format("{0:G29}", decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-US")))将给出"1E-08"作为结果。
试试下面的代码:
string value = "100";
value = value.Contains(".") ? value.TrimStart('0').TrimEnd('0').TrimEnd('.') : value.TrimStart('0');