我有一些由集合返回的字段
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也会四舍五入其他值。
取决于你的数字代表什么,以及你想如何管理这些值:它是一种货币,你需要舍入还是截断,你只需要这个舍入来显示吗?
如果用于显示,则考虑格式化数字为x.ToString("")
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx和
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
如果只是四舍五入,请使用Math。需要midpointround重载的圆重载
http://msdn.microsoft.com/en-us/library/ms131274.aspx)
如果你从数据库中获取值,考虑转换而不是转换: double value = (decimal)myRecord["columnName"];
这是可行的:
decimal source = 2.4200m;
string output = ((double)source).ToString();
或者如果你的初始值是string:
string source = "2.4200";
string output = double.Parse(source).ToString();
请注意这条评论。
如果输入是一个字符串,它不是这么简单吗?你可以使用其中一个:
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"作为结果。
我遇到了同样的问题,但在我无法控制输出到字符串的情况下,这是由库处理的。在详细了解了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();
在我看来,使用自定义数字格式字符串更安全。
decimal d = 0.00000000000010000000000m;
string custom = d.ToString("0.#########################");
// gives: 0,0000000000001
string general = d.ToString("G29");
// gives: 1E-13
一个非常低级的方法,但我相信这将是最高效的方法,只使用快速整数计算(没有缓慢的字符串解析和区域性敏感的方法):
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);
}
我从http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/上找到了一个优雅的解决方案
基本上
decimal v=2.4200M;
v.ToString("#.######"); // Will return 2.42. The number of # is how many decimal digits you support.
试试下面的代码:
string value = "100";
value = value.Contains(".") ? value.TrimStart('0').TrimEnd('0').TrimEnd('.') : value.TrimStart('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%
我使用这个代码来避免“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;
}
你可以设置为:
decimal decNumber = 23.45600000m;
Console.WriteLine(decNumber.ToString("0.##"));
非常简单的答案是使用TrimEnd()。这是结果,
double value = 1.00;
string output = value.ToString().TrimEnd('0');
输出为1 如果我的值是1.01,那么输出将是1.01
下面的代码可以用来不使用字符串类型:
int decimalResult = 789.500
while (decimalResult>0 && decimalResult % 10 == 0)
{
decimalResult = decimalResult / 10;
}
return decimalResult;
返回789.5
这很简单。
decimal decNumber = Convert.ToDecimal(value);
return decNumber.ToString("0.####");
测试。
欢呼:)
尝试做更友好的解决方案DecimalToString (https://stackoverflow.com/a/34486763/3852139):
private static decimal Trim(this decimal value)
{
var s = value.ToString(CultureInfo.InvariantCulture);
return s.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)
? Decimal.Parse(s.TrimEnd('0'), CultureInfo.InvariantCulture)
: value;
}
private static decimal? Trim(this decimal? value)
{
return value.HasValue ? (decimal?) value.Value.Trim() : null;
}
private static void Main(string[] args)
{
Console.WriteLine("=>{0}", 1.0000m.Trim());
Console.WriteLine("=>{0}", 1.000000023000m.Trim());
Console.WriteLine("=>{0}", ((decimal?) 1.000000023000m).Trim());
Console.WriteLine("=>{0}", ((decimal?) null).Trim());
}
输出:
=>1
=>1.000000023
=>1.000000023
=>
这个怎么样:
public static string TrimEnd(this decimal d)
{
string str = d.ToString();
if (str.IndexOf(".") > 0)
{
str = System.Text.RegularExpressions.Regex.Replace(str.Trim(), "0+?$", " ");
str = System.Text.RegularExpressions.Regex.Replace(str.Trim(), "[.]$", " ");
}
return str;
}
这是我写的一个扩展方法,如果它是最后一个字符(在0被删除之后),它也会删除点或逗号:
public static string RemoveZeroTail(this decimal num)
{
var result = num.ToString().TrimEnd(new char[] { '0' });
if (result[result.Length - 1].ToString() == "." || result[result.Length - 1].ToString() == ",")
{
return result.Substring(0, result.Length - 1);
}
else
{
return result;
}
}
要从字符串变量dateTicks中删除后面的零,请使用
返回新的字符串(dateTicks.Take(dateTicks.LastIndexOf(dateTicks.Last(v => v != '0')) + 1)。ToArray());
其他答案:
在WPF应用程序中使用XAML你可以使用
{Binding yourDecimal, StringFormat='#,0.00#######################'}
上面的答案将在某些情况下保留0,因此您仍然可以返回2.00
{Binding yourDecimal, StringFormat='#,0.#########################'}
如果要删除所有后面的零,请相应地进行调整。
下面的代码将能够删除后面的0。我知道这很难,但很有效。
private static string RemoveTrailingZeros(string input)
{
for (int i = input.Length - 1; i > 0; i-- )
{
if (!input.Contains(".")) break;
if (input[i].Equals('0'))
{
input= input.Remove(i);
}
else break;
}
return input;
}
string.Format("{0:G29}", decimal.Parse("2.00"))
string.Format("{0:G29}", decimal.Parse(Your_Variable))