我正在寻找一种简单的方法来转换数字字符串,例如“1.78M”“1.47B”为整数变量。
感谢任何帮助。
感谢
答案 0 :(得分:3)
您是否在寻找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很好。 : - )
如果是后者,你可以进行正则表达式,然后进行强制,例如:
C:\PS> [long]("3.34 B" -replace '(\d+)\s*(B)','$1E9')
3340000000
答案 1 :(得分:1)
没有任何内置支持后缀,如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