2017-11-28 10 views

답변

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"; 
    } 
} 
+2

개선의 문제, 당신은 당신의 스위치에 대한 범위를 사용할 수 있습니다'-19 ..- (21) {<#stuff#>}' – TheIncorrigible1

+0

나는 코드가 단지 전력 - 아래의 값을 갖는 에지의 경우 문제가있는 것입니다 의심 1000의. '$ d.ToString()'은 기본 정밀도 6 자리가 아닙니까? 그러므로 999.999999999를 출력하면''1.000000k ''가 아닌''1000.000000''이 출력됩니다. – chux

+0

BTW : 아마도'([int] [Math] :: Floor ($ exponent))/3'을 사용하여'switch'를 단순화할까요? – chux