我正在寻找一种将数字字符串(例如“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
没有内置支持 M 表示百万、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