如何在工程表示法中格式化[双]浮点数

时间:2017-11-28 15:55:10

标签: powershell math floating-point

如何在工程符号中格式化[双]浮点数?

PS> Engr(10e-8)
100 nano

PS> Engr(10e-7)
1 micro

1 个答案:

答案 0 :(得分:2)

function Engr([double] $d) {
    [double] $exponent = [Math]::Log10([Math]::Abs($d))
    if ([Math]::Abs($d) -ge 1) {
        switch([int][Math]::Floor($exponent)) {
            0  {return $d.ToString()}
            1  {return $d.ToString()}
            2  {return $d.ToString()}
            3  {return ($d / 1e3).ToString()  + "k"}
            4  {return ($d / 1e3).ToString()  + "k"}
            5  {return ($d / 1e3).ToString()  + "k"}
            6  {return ($d / 1e6).ToString()  + "M"}
            7  {return ($d / 1e6).ToString()  + "M"}
            8  {return ($d / 1e6).ToString()  + "M"}
            9  {return ($d / 1e9).ToString()  + "G"}
            10 {return ($d / 1e9).ToString()  + "G"}
            11 {return ($d / 1e9).ToString()  + "G"}
            12 {return ($d / 1e12).ToString() + "T"}
            13 {return ($d / 1e12).ToString() + "T"}
            14 {return ($d / 1e12).ToString() + "T"}
            15 {return ($d / 1e15).ToString() + "P"}
            16 {return ($d / 1e15).ToString() + "P"}
            17 {return ($d / 1e15).ToString() + "P"}
            18 {return ($d / 1e18).ToString() + "E"}
            19 {return ($d / 1e18).ToString() + "E"}
            20 {return ($d / 1e18).ToString() + "E"}
            21 {return ($d / 1e21).ToString() + "Z"}
            22 {return ($d / 1e21).ToString() + "Z"}
            23 {return ($d / 1e21).ToString() + "Z"}
            default {return ($d / 1e24).ToString() + "Y"}     
        }
    }
    elseif ([Math]::Abs($d) -gt 0) {

        switch ([int][Math]::Floor($exponent)) {
            -1  {return ($d * 1e3).ToString()  + "m"}
            -2  {return ($d * 1e3).ToString()  + "m"}
            -3  {return ($d * 1e3).ToString()  + "m"}
            -4  {return ($d * 1e6).ToString()  + "µ"}
            -5  {return ($d * 1e6).ToString()  + "µ"}
            -6  {return ($d * 1e6).ToString()  + "µ"}
            -7  {return ($d * 1e9).ToString()  + "n"}
            -8  {return ($d * 1e9).ToString()  + "n"}
            -9  {return ($d * 1e9).ToString()  + "n"}
            -10 {return ($d * 1e12).ToString() + "p"}
            -11 {return ($d * 1e12).ToString() + "p"}
            -12 {return ($d * 1e12).ToString() + "p"}              
            -13 {return ($d * 1e15).ToString() + "f"}
            -14 {return ($d * 1e15).ToString() + "f"}
            -15 {return ($d * 1e15).ToString() + "f"}
            -16 {return ($d * 1e15).ToString() + "a"}
            -17 {return ($d * 1e15).ToString() + "a"}
            -18 {return ($d * 1e15).ToString() + "a"}
            -19 {return ($d * 1e15).ToString() + "z"}
            -20 {return ($d * 1e15).ToString() + "z"}
            -21 {return ($d * 1e15).ToString() + "z"}
            default {return ($d * 1e15).ToString() + "y"}
        }
    }
    else
    {
        return "0";
    }
}