2012-09-12 53 views
1

我正在尋找一種簡單的方法來轉換數字字符串,例如「1.78M」「1.47B」爲一個整型變量。Powershell字符串到數字函數?

任何幫助表示讚賞。

感謝

+0

由於您的示例中'M'和'B'不符合任何行業標準,因此沒有標準庫或函數。你可以自己寫一個函數來做到這一點。 – EBGreen

回答

3

您是否在尋找M == MBM == 1E6?如果是前者,PowerShell的理解KB,MB,GB和TB例如: -

C:\PS> Invoke-Expression "2MB" 
2097152 

大告誡這裏Invoke-Expression,如果你得到來自用戶,文件,即不受信任來源的字符串。你必須小心執行它。假設字符串是"2MB; Remove-Item C:\ -Recurse -Force -Whatif -EA 0",那麼在該字符串上使用Invoke-Expression會有糟糕的一天。順便說一句,我在這裏很好,加入了-Whatif。 :-)

如果是後者,你可以做一個正則表達式-replace後跟一個強制例如:爲十億

C:\PS> [long]("3.34 B" -replace '(\d+)\s*(B)','$1E9') 
3340000000 
+0

謝謝基思。我是後一種情況,這個「替換」很好。 :) –

0

沒有什麼內置支持像中號後綴萬元,B,等等。只有對「文件大小」後綴的內置支持,例如32KB -> 32768

這是我在基本腳本版本中解決您的問題的嘗試。如果需要,它支持多字符後綴,或根本不支持後綴。它總是會返回一個[int],所以請注意溢出(例如,5.5B會導致錯誤,因爲它不適合int)。您可以稍微修改一下類型以支持更大的數字。

function ToNumber 
{ 
    param([string] $NumberString) 

    # add other multiplier suffixes to this table 
    $multipliers = @{ 'B' = 1000000000; 'M' = 1000000; 'K' = 1000; '' = 1 } 

    switch -regex ($numberString) 
    { 
     '^(?<base>[\d\.]+)(?<suffix>\w*)$' 
     { 
     $base = [double] $matches['base'] 
     $multiplier = [int] $multipliers[$matches['suffix']] 

     if($multiplier) 
     { 
      [int]($base * $multiplier) 
     } 
     else 
     { 
      throw "$($matches['suffix']) is an unknown suffix" 
     } 
     } 
     default 
     { 
     throw 'Unable to parse input' 
     } 
    } 
} 

C:\> ToNumber '1.7B' 
1700000000 
C:\> ToNumber '1.7K' 
1700 
+0

downvoter會照顧自己解釋嗎? – latkin

+0

引用Chuck Berry - 「不是我」。 :-) –

+0

謝謝拉金。你的功能比我的功能更復雜。順便說一句,這不是我。 :) –