2

我正在String.Format().NET Framework 中寻找一个允许这样做的说明符:

-- 例如,对于介于 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”)来生成它的正则表达式?

4

3 回答 3

3

我认为您不会找到一个可以为您提供这些结果的格式字符串,但这里有一个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
于 2013-07-16T18:09:04.903 回答
1

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
于 2013-07-16T17:43:00.337 回答
0

我会实现一个简单的扩展方法:

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);
    }
}
于 2013-07-16T18:12:20.673 回答