Powershell:将字符串转换为数字

42

我有一个数组,其中捕获了来自WMI的一些驱动器数据:

$drivedata = $Drives | select  @{Name="Kapazität(GB)";Expression={$_.Kapazität}}

数组中有这些值(2个驱动器):

@{Kapazität(GB)=1.500} @{Kapazität(GB)=1.500}

我只想把1.500转换为1500这个数字

我尝试了在这里找到的不同建议,但无法让它起作用:

-替换“.”,“”和[int]无效。 我不确定正则表达式是否正确以及如何操作。


1
你如何从WMI获取数据?当我使用Get-WmiObject Win32_logicaldisk时,大小属性值的类型是整数。因此,修复这个“问题”可能会更好? - Ocaso Protal
1
基本数学:1.5 * 1000 = 1500。也许您错标了属性,这就是数字不符合预期的原因(TB与GB之间)? - Raf
@OcasoProtal:我正在使用对象:code $Data = Get-ClusterSharedVolume -Cluster $Clustername | select -Expand SharedVolumeInfo | select FriendlyVolumeName , @{n="Kapazität";e={"{0:N0}" -f ($_.Partition.Size/1GB)}} - MMAX
@Raf:只要容量低于1,000 GB,脚本就可以正常运行 :-) 不幸的是,我很难找到适当的变量格式 - 你能看一下我上面的评论吗? - MMAX
6个回答

64

仅仅将字符串强制转换为int并不可靠。您需要将其转换为int32。为此,您可以使用.NET convert类及其ToInt32方法。该方法需要一个字符串 ($strNum) 作为主要输入,并且需要转换的数字系统的基数 (10)。这是因为您不仅可以将其转换为十进制系统(10进制),还可以将其转换为例如二进制系统(2进制)。

请尝试使用这个方法:

[string]$strNum = "1.500"
[int]$intNum = [convert]::ToInt32($strNum, 10)

$intNum

4
当字符串不是整数时会发生什么... 这会导致程序崩溃,对吗? - Nicholas
1
如果字符串不是数字,这将会出错。 例如:[int]$intNum = [convert]::ToInt32("not a number", 10) 异常调用 "ToInt32",有 "2" 个参数: "Could not find any recognizable digits." - ChadJPetersen

31

只需将包含数字的变量作为字符串除以1即可。PowerShell会自动将结果转换为整数。

$a = 15; $b = 2; $a + $b --> 152

但如果在除法之前进行除法运算:

$a/1 + $b/1 --> 17


11

由于这个主题从未获得过经过验证的解决方案,我可以为你提供一个简单的解决方案来解决你所要求的两个问题。

  1. 当值为字符串时替换“.”字符

字符串类为您想要更新的字符串对象提供了一个替换方法:

示例:

$myString = $myString.replace(".","") 
  1. 将字符串值转换为整数

系统中的int32类(或者在 PowerShell 中简写为[int])有一个名为“TryParse”的可用方法,它不仅会返回一个布尔值,指示字符串是否为整数,而且如果返回true,则会通过引用将整数值返回到现有变量中。

例如:

[string]$convertedInt = "1500"
[int]$returnedInt = 0
[bool]$result = [int]::TryParse($convertedInt, [ref]$returnedInt)

我希望这解决了你在问题中最初提出的问题。


最安全的解决方案... (y) - Kreshnik

2
将字符串中除数字以外的所有内容替换为如下所示的内容:
$messyString = "Get the integer from this string: -1.500 !!"
[int]$myInt = $messyString -replace '\D', ''
$myInt
# PS > 1500

正则表达式\D将匹配除数字以外的所有内容,并将其从字符串中删除。

这对于您的示例非常有效。


1
我演示如何接收一个字符串,比如“-484876800000”,并尝试将该字符串解析为长整型以确保其可以被赋值。我从通用时间计算日期并返回一个字符串。当您将字符串转换为数字时,必须决定数字类型和精度,并测试字符串数据是否可以解析,否则会抛出错误。
function universalToDate
{
 param (
    $paramValue
  )
    $retVal=""


    if ($paramValue)
    {
        $epoch=[datetime]'1/1/1970'
        [long]$returnedLong = 0
        [bool]$result = [long]::TryParse($paramValue,[ref]$returnedLong)
        if ($result -eq 1)
        {
            $val=$returnedLong/1000.0
            $retVal=$epoch.AddSeconds($val).ToString("yyyy-MM-dd")
        }
    }
    else
    {
        $retVal=$null
    }
    return($retVal)
 }

-2

看起来问题出在“-f ($_.Partition.Size/1GB)}}”这一行。如果你想要以MB为单位显示数值,那么把1GB改成1MB即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接