[英]String.Format for a specific use case
我正在.NET Framework中寻找String.Format()
说明符,该说明符将允许以下操作:
-例如,对于介于0和1之间的值,前导数字(0或1),小数点分隔符和后三位数字。 0.995、1.000、0.015
-介于0到100之间,两位小数:0.00、5.46、10.0
-介于100和10000之间,无小数位:543、886、2576
本质上,我认为需要四个有效数字,只有当数字很小时,小数位才会出现。 我的输出都没有负值。 编辑:我需要避免科学计数法。
是否有格式说明符可以给我一些类似的东西? 或者,或者,将修改双精度字符串(例如“ 43667.73625003946255”)以生成它的正则表达式?
我认为您不会找到可以为您提供这些结果的单一格式字符串,但是以下是一个自定义的IFormatProvider
应该可以工作:
public class CustomFormatter : IFormatProvider, ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if(IsNumber(arg))
{
double number = Convert.ToDouble(arg);
if(number < 1)
return string.Format("{0:0.000}", arg);
else if(number < 10)
return string.Format("{0:0.00}", arg);
return string.Format("{0:0}", arg);
}
else return string.Format(format,arg); // default formatting for other types
}
public object GetFormat(Type formatType)
{
return (formatType == typeof(ICustomFormatter)) ? this : null;
}
public static bool IsNumber(object value)
{
return value is sbyte
|| value is byte
|| value is short
|| value is ushort
|| value is int
|| value is uint
|| value is long
|| value is ulong
|| value is float
|| value is double
|| value is decimal;
}
}
void Main()
{
foreach(object val in (new object[] {0, 0.05, 1, 1.0, 1.5, 9.9, 10, 10m,0XFF}))
Console.WriteLine(val + " : "+string.Format(new CustomFormatter(),"{0}",val));
}
输出:
0 : 0.000
0.05 : 0.050
1 : 1.00
1.0 : 1.00
1.5 : 1.50
9.9 : 9.90
10 : 10
10m : 10
255 : 255
doubeValue.ToString("g3")
将为您提供3个有效数字的文本表示形式。
请注意,如果小数点左边多于3位,它将使用科学计数法。
0.57464.ToString("g3") //---> 0.575
1234.ToString("g3") //---> 1.23e+03
13.ToString("g3") //---> 13
string.Format("{0:g3}", 999) //---> 999
string.Format("{0:g3}", 0.000324) //---> 0.000324
我将实现一个简单的扩展方法:
public static class DoubleExtensions {
public static string ToCustomString(this double value) {
var absValue = Math.Abs(value);
if (absValue < 1)
return string.Format("{0:N3}", value);
if (absValue < 100)
return string.Format("{0:N2}", value);
return string.Format("{0:N0}", value);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.