使用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))