使用string格式显示小数点最多2个位置或简单的整数

我有一个价格字段显示哪些有时可以是100或100.99或100.9,我想要显示的价格在小数点后两位,只有当小数input的价格,例如如果它的100所以它应该只显示100不是100.00,如果价格是100.2,它应该显示100.20同样为100.22应该是相同的。 我GOOGLE了一些例子,但他们不符合我想要的:

// just two decimal places String.Format("{0:0.00}", 123.4567); // "123.46" String.Format("{0:0.00}", 123.4); // "123.40" String.Format("{0:0.00}", 123.0); // "123.00" 

一个不雅的方法是:

 var my = DoFormat(123.0); 

随着DoFormat如下所示:

 public static string DoFormat( double myNumber ) { var s = string.Format("{0:0.00}", myNumber); if ( s.EndsWith("00") ) { return ((int)myNumber).ToString(); } else { return s; } } 

不是很高雅,但在某些项目的类似情况下为我工作。

对不起,重新激活这个问题,但我没有在这里find正确的答案。

在格式化数字你可以使用“0”作为强制性的地方和“#”作为可选的地方。 所以:

 // just two decimal places String.Format("{0:0.##}", 123.4567); // "123.46" String.Format("{0:0.##}", 123.4); // "123.4" String.Format("{0:0.##}", 123.0); // "123" 

你也可以把“0”和“#”结合起来。

 String.Format("{0:0.0#}", 123.4567) // "123.46" String.Format("{0:0.0#}", 123.4) // "123.4" String.Format("{0:0.0#}", 123.0) // "123.0" 

对于这种格式总是使用CurrentCulture。 对于一些文化“。” 将被改为“,”。

这是一个常见的格式化浮动数字用例。

不幸的是,所有内置的单字母格式string(例如F,G,N)都不能直接实现。
例如, num.ToString("F2")将始终显示2个小数位,如123.40

您将不得不使用0.##模式,即使它看起来有点冗长。

一个完整的代码示例:

 double a = 123.4567; double b = 123.40; double c = 123.00; string sa = a.ToString("0.##"); // 123.46 string sb = b.ToString("0.##"); // 123.4 string sc = c.ToString("0.##"); // 123 

尝试

 double myPrice = 123.0; String.Format(((Math.Round(myPrice) == myPrice) ? "{0:0}" : "{0:0.00}"), myPrice); 

老问题,但我想在我看来增加最简单的选项。

没有数千个分隔符:

 value.ToString(value % 1 == 0 ? "F0" : "F2") 

拥有数千个分隔符:

 value.ToString(value % 1 == 0 ? "N0" : "N2") 

相同,但与String.Format

 String.Format(value % 1 == 0 ? "{0:F0}" : "{0:F2}", value) // Without thousands separators String.Format(value % 1 == 0 ? "{0:N0}" : "{0:N2}", value) // With thousands separators 

如果你在很多地方需要它,我会用一个扩展方法来使用这个逻辑:

 public static string ToCoolString(this decimal value) { return value.ToString(value % 1 == 0 ? "N0" : "N2"); // Or F0/F2 ;) } 

无论如何,我不知道在格式说明符中添加条件,但是您可以编写自己的格式化程序:

 using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // all of these don't work Console.WriteLine("{0:C}", 10); Console.WriteLine("{0:00.0}", 10); Console.WriteLine("{0:0}", 10); Console.WriteLine("{0:0.00}", 10); Console.WriteLine("{0:0}", 10.0); Console.WriteLine("{0:0}", 10.1); Console.WriteLine("{0:0.00}", 10.1); // works Console.WriteLine(String.Format(new MyFormatter(),"{0:custom}", 9)); Console.WriteLine(String.Format(new MyFormatter(),"{0:custom}", 9.1)); Console.ReadKey(); } } class MyFormatter : IFormatProvider, ICustomFormatter { public string Format(string format, object arg, IFormatProvider formatProvider) { switch (format.ToUpper()) { case "CUSTOM": if (arg is short || arg is int || arg is long) return arg.ToString(); if (arg is Single || arg is Double) return String.Format("{0:0.00}",arg); break; // Handle other default: try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(String.Format("The format of '{0}' is invalid.", format), e); } } return arg.ToString(); // only as a last resort } private string HandleOtherFormats(string format, object arg) { if (arg is IFormattable) return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture); if (arg != null) return arg.ToString(); return String.Empty; } public object GetFormat(Type formatType) { if (formatType == typeof(ICustomFormatter)) return this; return null; } } } 

恐怕没有内置格式可以做到这一点。 您将不得不使用不同的格式,取决于值是否是整数。 或者始终格式化为2个小数位,然后操作string以删除任何尾随的“.00”。

这里是Uwe Keim方法的替代方法,它仍然保持相同的方法调用:

 var example1 = MyCustomFormat(123.1); // Output: 123.10 var example2 = MyCustomFormat(123.95); // Output: 123.95 var example3 = MyCustomFormat(123); // Output: 123 

MyCustomFormat是类似的:

 public static string MyCustomFormat( double myNumber ) { var str (string.Format("{0:0.00}", myNumber)) return (str.EndsWith(".00") ? str.Substring(0, strLastIndexOf(".00")) : str; } 

简单的一行代码:

 public static string DoFormat(double myNumber) { return string.Format("{0:0.00}", myNumber).Replace(".00",""); } 

像这样的东西也会工作:

 String.Format("{0:P}", decimal.Parse(Resellers.Fee)).Replace(".00", "") 

如果没有其他答案适用于您,可能是因为您在OnLoad函数中绑定了控件的ContentProperty ,这意味着这不起作用:

 private void UserControl_Load(object sender, RoutedEventArgs e) { Bind.SetBindingElement(labelName, String.Format("{0:0.00}", PropertyName), Label.ContentProperty) } 

解决scheme很简单:在xaml中有一个ContentStringFormat属性。 所以当你创build标签的时候这样做:

 //if you want the decimal places definite <Label Content="0" Name="labelName" ContentStringFormat="0.00"/> 

要么

 //if you want the decimal places to be optional <Label Content="0" Name="labelName" ContentStringFormat="0.##"/> 

为了让代码更清楚,Kahia写了(很明显,但是当你想添加更多的文本变得棘手)…尝试这个简单的解决scheme。

 if (Math.Round((decimal)user.CurrentPoints) == user.CurrentPoints) ViewBag.MyCurrentPoints = String.Format("Your current Points: {0:0}",user.CurrentPoints); else ViewBag.MyCurrentPoints = String.Format("Your current Points: {0:0.0}",user.CurrentPoints); 

我不得不添加额外的演员(十进制),让Math.Round比较两个十进制variables。

这对我有用!

 String amount= "123.0000"; String.Format("{0:0.##}", amount); // "123.00" 

String.Format(“{0:0.00}”,Convert.ToDecimal(totalPrice))