如何将字符串值转换为正确的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将字符串值转换为正确的类型相关的知识,希望对你有一定的参考价值。

我有一个函数foo,我想以这种格式传递参数列表:

foo -ArgumentList "a=1", "b=hello", "c=15.00"

我需要知道每个=之后的值是intstring还是double (float)

这是我的代码:

Function foo 

    Param(
        [ValidateScript( $_ -match ".*=.*" )]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) 

        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if ($ParamValue -is [string]) 
            "2049" + $ParamName + $ParamValue
         
        elseif ($ParamValue -is [int]) 
            "2050" + $ParamName + $ParamValue
         
        elseif ($ParamValue -is [double]) 
            "2051" + $ParamName + $ParamValue
         
        else 
            Write-Host "Not a string, int or float."
        
     

但是,Value始终是字符串,这是有意义的,因为它是从字符串中读取的。

我能以某种方式将其转换为正确的类型吗?

我知道我可以做这样的事情,但这不可靠,因为例如1可以代表一切

PS C:\Users\s> "1" -as [int]
1
PS C:\Users\s> "1" -as [double]
1
PS C:\Users\s> "1" -as [string]
1
答案

我只使用值类型的TryParse(string,[ref]var)方法。

Function foo 

    Param(
        [ValidateScript( $_ -match ".*=.*" )]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) 

        $temp = $null
        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if ([int]::TryParse($ParamValue,[ref]$temp)) 
            $ParamValue = $temp
            "2049" + $ParamName + $ParamValue
            $ParamValue.GetType().FullName
         
        elseif ([double]::TryParse($ParamValue,[ref]$temp)) 
            $ParamValue = $temp
            "2050" + $ParamName + $ParamValue
            $ParamValue.GetType().FullName
         
        elseif ($ParamValue -is [string]) 
            "2051" + $ParamName + $ParamValue
            $ParamValue.GetType().FullName
         
        else 
            Write-Host "Not a string, int or float."
        
     

我添加了$ParamValue.GetType().FullName,因此您可以看到正在设置的类型。 [type]::TryParse(string,[ref]$temp)方法将尝试将字符串强制转换为类型。它将返回TrueFalse,并将相应的值存储到$temp中。在我们的测试案例中,False将在0中产生一个$temp值。如果为True,则$temp将包含强制转换值。

注意:您必须意识到,一旦引入字符串连接("2048" + somevalue),该表达式的输出就是string

另一答案

您可以使用-as这样测试受限类型-

$val = '23.00' #input value to be type-casted

$intVal = $val -as [int]
$floatVal = $val -as [float]

if ($null -ne $floatVal -and $intVal -ne $floatVal) 
$val = $floatVal # value is float type
 elseif ($null -ne $intVal) 
$val = $intVal # value is int type
 else 
Write-output '$val is already string type' # value is not float or int, so use it as string

另一答案

我刚刚在函数中添加了一些类型转换的if语句。

Function foo 

    Param(
        [ValidateScript( $_ -match ".*=.*" )]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) 

        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if($ParamName -eq "a")
            $ParamValue = [int]$ParamValue
        

        if($ParamName -eq "b")
            $ParamValue = [string]$ParamValue
        

        if($ParamName -eq "c")
            $ParamValue = [double]$ParamValue
        



        if ($ParamValue -is [string]) 
            "2049" + $ParamName + $ParamValue
         
        elseif ($ParamValue -is [int]) 
            "2050" + $ParamName + $ParamValue
         
        elseif ($ParamValue -is [double]) 
            "2051" + $ParamName + $ParamValue
         
        else 
            Write-Host "Not a string, int or float."
        
     

另一答案

如您所知,将值传递给参数时,您正在将类型设置为字符串,它应始终作为字符串求值。

如果将参数设置为数组,则函数可能会起作用。在下面的示例中,Get-Member显示了数组中对象的类型。

如何获得参数的值?在将格式传递给函数之前,最好先更改格式。

[string]$a= "string"
[int]$b = 1
[array]$array = $a,$b
$array | Get-Member

以上是关于如何将字符串值转换为正确的类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串值转换为 Json 类型

如何将字典中的字符串值转换为 int/float 数据类型?

C++中如何将一个字符串(string类型的)映射(转换)到枚举值(enum)

将字符串转换为日期时间错误 [重复]

如何使用 scala 和 json spray 将混合类型值的 json 转换为 json

C++,如何从字符串中获取正确的双精度值?