C#中的工程符号?

Nic*_*ick 11 c# string

是否有任何代码(或内置函数)允许以工程符号输出浮点数?

例如,1.5e-4将显示为,150µ并且5e-3将显示为5m.

Pat*_*ald 10

这可能需要重构:

private static string ToEngineeringNotation(this double d)
{
    double exponent = Math.Log10(Math.Abs(d));
    if (Math.Abs(d) >= 1)
    {
        switch ((int)Math.Floor(exponent))
        {
            case 0: case 1: case 2:
                return d.ToString();
            case 3: case 4: case 5:
                return (d / 1e3).ToString() + "k";
            case 6: case 7: case 8:
                return (d / 1e6).ToString() + "M";
            case 9: case 10: case 11:
                return (d / 1e9).ToString() + "G";
            case 12: case 13: case 14:
                return (d / 1e12).ToString() + "T";
            case 15: case 16: case 17:
                return (d / 1e15).ToString() + "P";
            case 18: case 19: case 20:
                return (d / 1e18).ToString() + "E";
            case 21: case 22: case 23:
                return (d / 1e21).ToString() + "Z";
            default:
                return (d / 1e24).ToString() + "Y";
        }
    }
    else if (Math.Abs(d) > 0)
    {
        switch ((int)Math.Floor(exponent))
        {
            case -1: case -2: case -3:
                return (d * 1e3).ToString() + "m";
            case -4: case -5: case -6:
                return (d * 1e6).ToString() + "?";
            case -7: case -8: case -9:
                return (d * 1e9).ToString() + "n";
            case -10: case -11: case -12:
                return (d * 1e12).ToString() + "p";
            case -13: case -14: case -15:
                return (d * 1e15).ToString() + "f";
            case -16: case -17: case -18:
                return (d * 1e15).ToString() + "a";
            case -19: case -20: case -21:
                return (d * 1e15).ToString() + "z";
            default:
                return (d * 1e15).ToString() + "y";
        }
    }
    else
    {
        return "0";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @DrAl,一个不间断的空间;o) http://en.wikipedia.org/wiki/International_System_of_Units#General_rules (2认同)

tva*_*son 8

这里是一些类似Ruby代码的链接,虽然格式为dddem,其中m,指数,总是3的倍数.

音译到C#.由于我不熟悉这种格式,我不确定这完全符合您的要求.例如,0.0015格式为2e-3.使用案例陈述和UTF-8或其他编码将希腊字母替换为指数是相当简单的.演习留给读者.

public static class FormatExtensions
{
    public static string ToEngineering( this double value )
    {
        int exp = (int)(Math.Floor( Math.Log10( value ) / 3.0 ) * 3.0);
        double newValue = value * Math.Pow(10.0,-exp);
        if (newValue >= 1000.0) {
            newValue = newValue / 1000.0;
            exp = exp + 3;
        }
        return string.Format( "{0:##0}e{1}", newValue, exp);        
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Console.WriteLine( ((double)15000).ToEngineering() );
double val = 15000;
Console.WriteLine( val.ToEngineering() );
Run Code Online (Sandbox Code Playgroud)


hig*_*ted 6

我没有使用子类化,而是利用Double实现IFormattable并编写一个格式化数字的IFormatProvider这一事实.然后我的代码看起来类似于:

double d = 123.45;
Console.WriteLine(d.ToString(null, new MyCustomFormat()));
Run Code Online (Sandbox Code Playgroud)


Pau*_*ier -2

为了解决这个问题,您需要创建一个继承自 Float 的类(称为 Engineering),并在该类上重写 ToString() 成员。

编辑:好的,我现在明白这个问题了。不过,解决方案是子类化。

  • 结构不能被子类化。一个好的方法是按照高浓度咖啡因所说的去做:实现一个格式化程序。实现一个返回格式化字符串的扩展方法也是一个不错的选择。 (2认同)