Powershell字符串到数字函数?

时间:2012-09-12 17:08:49

标签: string powershell format

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

感谢任何帮助。

感谢

2 个答案:

答案 0 :(得分: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很好。 : - )

如果是后者,你可以进行正则表达式,然后进行强制,例如:

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