如何将字符串值转换为正确的类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将字符串值转换为正确的类型相关的知识,希望对你有一定的参考价值。
我有一个函数foo
,我想以这种格式传递参数列表:
foo -ArgumentList "a=1", "b=hello", "c=15.00"
我需要知道每个=
之后的值是int
,string
还是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)
方法将尝试将字符串强制转换为类型。它将返回True
或False
,并将相应的值存储到$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
以上是关于如何将字符串值转换为正确的类型的主要内容,如果未能解决你的问题,请参考以下文章
如何将字典中的字符串值转换为 int/float 数据类型?
C++中如何将一个字符串(string类型的)映射(转换)到枚举值(enum)