Answers:
我使用以下内容:
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 s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
string.Format
字符串的同一步骤中执行对区域性敏感的格式化。请参阅下面的答案。
以下代码将数字四舍五入,但是最多显示两位小数(删除所有尾随零).##
。
decimal d0 = 24.154m;
decimal d1 = 24.155m;
decimal d2 = 24.1m;
decimal d3 = 24.0m;
d0.ToString("0.##"); //24.15
d1.ToString("0.##"); //24.16 (rounded up)
d2.ToString("0.##"); //24.1
d3.ToString("0.##"); //24
http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/
我建议您先截断,然后格式化:
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,后跟任意数量的零。使用您需要的区域性名称来调整格式结果。
new CultureInfo("de-DE")
,你应该使用静态属性Culture.InvariantCulture
最简单的方法,使用数字格式的字符串:
double total = "43.257"
MessageBox.Show(total.ToString("F"));
如何添加一个要舍入然后舍弃的额外小数点:
var d = 0.241534545765;
var result1 = d.ToString("0.###%");
var result2 = result1.Remove(result1.Length - 1);
我知道这是一个旧线程,但是我只需要这样做。尽管这里的其他方法可行,但我希望有一种简单的方法来影响对的大量调用string.format
。因此,Math.Truncate
在所有呼叫中加入并不是一个好选择。同样,由于某些格式存储在数据库中,因此甚至更糟。
因此,我制作了一个自定义格式提供程序,该提供程序将允许我在格式设置字符串中添加截断,例如:
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;
}
}
我在Xamarin Forms上遇到了问题,并通过以下方法解决了该问题:
percent.ToString("0.##"+"%")
为了显示货币,您可以使用"C"
:
double cost = 1.99;
m_CostText.text = cost.ToString("C"); /*C: format as currentcy */
输出: $1.99
您也可以编写自己的IFormatProvider,尽管我想最终您必须考虑一种进行实际截断的方法。
.NET Framework也支持自定义格式。这通常涉及创建同时实现IFormatProvider和ICustomFormatter的格式化类。(msdn)
至少它将很容易重用。
在CodeProject上有一篇关于如何实现自己的IFormatProvider / ICustomFormatter的文章。在这种情况下,“扩展”现有数字格式可能是最好的选择。它看起来并不难。
以下仅可用于使用String ..属性的显示。
double value = 123.456789;
String.Format("{0:0.00}", value);
另请注意您系统的CultureInformation。这里我的解决方案没有四舍五入。
在此示例中,您只需要将变量MyValue定义为double。结果,您在字符串变量NewValue中获得了格式化的值。
注意-还要设置C#using语句:
using System.Globalization;
string MyFormat = "0";
if (MyValue.ToString (CultureInfo.InvariantCulture).Contains (CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
{
MyFormat += ".00";
}
string NewValue = MyValue.ToString(MyFormat);