「1.78M」「1.47B」などの数値文字列を整数変数に変換する簡単な方法を探しています。
どんな助けでも大歓迎です。
ありがとう
M
==MB
またはM
==を探しています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 を追加して親切にしています。:-)
後者の場合は、regex -replace の後に強制を行うことができます。
C:\PS> [long]("3.34 B" -replace '(\d+)\s*(B)','$1E9')
3340000000
100 万を表す M、10 億を表す 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