C#Double – ToString()格式化,小数点后两位,但不舍入
如何在C#中将Double
设置为String
,以便只有两位小数?
如果我使用String.Format("{0:0.00}%", myDoubleValue)
,那么该数字是四舍五入的,我想要一个简单的截断没有任何舍入。 我也想要转换为String
是文化敏感的。
我使用以下内容:
double x = Math.Truncate(myDoubleValue * 100) / 100;
例如:
如果数字是50.947563,并且您使用以下内容,则会发生以下情况:
- Math.Truncate(50.947563 * 100) / 100; - Math.Truncate(5094.7563) / 100; - 5094 / 100 - 50.94
还有你的答案被截断,现在要格式化string,只需执行以下操作:
string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
decimal d = 0.241534545765m; decimal d2 = 0.241m; decimal d3 = 0.2m; d.ToString("0.##%"); //24.15% d2.ToString("0.##%"); //24.1% d3.ToString("0.##%"); //20%
http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/
我build议你先截断,然后格式化:
double a = 123.4567; double aTruncated = Math.Truncate(a * 100) / 100; CultureInfo ci = new CultureInfo("de-DE"); string s = string.Format(ci, "{0:0.00}%", aTruncated);
使用常数100来截取2位数; 使用1后面跟你想要的小数点后的数字一样多。 使用您需要的文化名称来调整格式化结果。
最简单的方法,使用数字格式string:
double total = "43.257" MessageBox.Show(total.ToString("F"));
我使用price.ToString("0.00")
获得领先的0
这是为我工作
string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();
凯尔Rozendo表示的C#函数:
string DecimalPlaceNoRounding(double d, int decimalPlaces = 2) { d = d * Math.Pow(10, decimalPlaces); d = Math.Truncate(d); d = d / Math.Pow(10, decimalPlaces); return string.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d); }
我知道这是一个古老的线程,但我只是不得不这样做。 虽然其他方法在这里工作,我想要一个简单的方法能够影响到string.format
的很多调用。 所以将Math.Truncate
添加到所有的调用并不是一个很好的select。 另外,由于一些格式存储在数据库中,这使得情况更糟。
因此,我做了一个自定义格式提供程序,它允许我添加截断格式化string,例如:
string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12 string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123 string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9
这个实现非常简单,很容易扩展到其他需求。
public class FormatProvider : IFormatProvider, ICustomFormatter { public object GetFormat(Type formatType) { if (formatType == typeof (ICustomFormatter)) { return this; } return null; } public string Format(string format, object arg, IFormatProvider formatProvider) { if (arg == null || arg.GetType() != typeof (double)) { try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } if (format.StartsWith("T")) { int dp = 2; int idx = 1; if (format.Length > 1) { if (format[1] == '(') { int closeIdx = format.IndexOf(')'); if (closeIdx > 0) { if (int.TryParse(format.Substring(2, closeIdx - 2), out dp)) { idx = closeIdx + 1; } } else { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } } double mult = Math.Pow(10, dp); arg = Math.Truncate((double)arg * mult) / mult; format = format.Substring(idx); } try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } private string HandleOtherFormats(string format, object arg) { if (arg is IFormattable) { return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture); } return arg != null ? arg.ToString() : String.Empty; } }
如何添加一个额外的小数,是舍入,然后丢弃:
var d = 0.241534545765; var result1 = d.ToString("0.###%"); var result2 = result1.Remove(result1.Length - 1);
以下可用于仅显示使用String属性的..
double value = 123.456789; String.Format("{0:0.00}", value);
你也可以编写你自己的IFormatProvider ,但是我想最终你不得不想办法去做实际的截断。
.NET Framework还支持自定义格式。 这通常涉及创build一个实现IFormatProvider和ICustomFormatter的格式化类。 (MSDN)
至less它会很容易重用。
有一篇关于如何在CodeProject上实现自己的IFormatProvider / ICustomFormatter的文章。 在这种情况下,“扩展”现有的数字格式可能是最好的select。 这看起来不太难。
为了显示货币,您可以使用"C"
:
double cost = 1.99; m_CostText.text = cost.ToString("C"); /*C: format as currentcy */
输出: $1.99