1

我正在寻找一种将数字字符串(例如“1.78M”“1.47B”)转换为整数变量的简单方法。

任何帮助表示赞赏。

谢谢

4

2 回答 2

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 很好。:-)

如果是后者,您可以执行 regex -replace 后跟强制,例如:

C:\PS> [long]("3.34 B" -replace '(\d+)\s*(B)','$1E9')
3340000000
于 2012-09-12T17:47:11.533 回答
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
于 2012-09-12T17:56:33.800 回答