无法在PowerShell中将字符串转换为int

时间:2019-03-05 15:17:49

标签: .net powershell type-conversion

我正在尝试使用PowerShell将字符串转换为整数。但是,即使我确定我没有,仍然会继续告诉我我没有有效的电话号码。

首先,这是我如何获取变量以及类型的打印输出等,以确保有效性:

$obj = (New-Object -TypeName PSCustomObject -Property @{
    LastSaved = $com.GetDetailsOf($_, 155).toString().trim()
})
Write-Host $obj.LastSaved
$datePart,$b,$c = $obj.LastSaved.Split(" ")
Write-Host $datePart
$intVar,$b,$c = $datePart.Split("/")
$intVar = $intVar.Trim()
$intVar -replace '\W', ''
Write-Host $intVar
Write-Host $intVar.GetType()

输出:

  

5/26/2016上午8:09

     

5/26/2016

     

5

     

System.String

这是我尝试进行转换的第一种方法:

[int]$converted = 0
[int]::TryParse($intVar, [ref]$converted)
Write-Host $converted

输出:

  

错误

     

0

下一个方法:

$converted = [convert]::ToInt32($intVar, 10)

结果:

  

使用“ 2”个参数调用“ ToInt32”的异常:“找不到任何可识别的数字。”

还有我尝试过的第三种方法:

$converted = $intVar / 1

结果:

  

无法将值“ 5”转换为“ System.Int32”。错误:“输入字符串的格式不正确。”

如果我手动为$intVar分配一个值为“ 5”($intVar = "5"),那么一切都很好,所以我认为获取值的方式一定存在问题。但是我不知道该怎么做,因为GetType()说它确实是一个字符串。

编辑:根据TobyU的回答,我也尝试过$intVar = [int]$intVar,结果相同

  

无法将值“ 5”转换为“ System.Int32”。错误:“输入字符串的格式不正确。”

编辑:另一种方法

$intVar = [int]::Parse($intVar)

哪个给:

  

使用“ 1”参数调用“解析”的异常:“输入字符串的格式不正确。”

编辑3:显然,如一些评论者所述,其中包含无效字符。这是Format-Hex的输出:

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   3F 32 36                                         ?26             

2 个答案:

答案 0 :(得分:3)

检查问题源文本中的错误消息会发现您的字符串包含不可见的LEFT-TO-RIGHT-MARK Unicode character (U+200E) ,这就是转换失败的原因。

删除该字符将使转换成功,在最简单的情况下,只需消除所有非数字字符即可实现。从字符串中:

# Simulate the input string with the invisible control char.
$intStr = [char] 0x200e + '5'

# FAILS, due to the invisible Unicode char.
[int] $intStr # -> ... "Input string was not in a correct format."

# OK - eliminate non-digits first.
# Note the required (...) for proper precedence.
[int] ($intStr -replace '\D') # -> 5

可选阅读:检查字符串的字符:

# Print the code points of the string's characters:
PS> [int[]] [char[]] $intStr
8206  # decimal equivalent of 0x200e, the LEFT-TO-RIGHT-MARK
53    # decimal equivalent of 0x54, the DIGIT FIVE

# Show the code points in hex. format and print the char.
PS> [char[]] $intStr | 
       Select-Object @{ n='CodePoint'; e={ 'U+{0}' -f ([int] $_).ToString('X4') } }, 
                     @{ n='Char';      e={ $_ } }

CodePoint Char
--------- ----
U+200E       ‎
U+0035       5

您也可以使用Format-Hex,但是这种格式在视觉上不容易解析:

PS> $intStr | Format-Hex -Encoding BigEndianUnicode

                       00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000000000000000   20 0E 00 35                                       ..5            
使用

-Encoding BigEndianUnicode(UTF16-BE)-即使.NET字符串使用Unicode(UTF16-LE),因此面向 byte 的显示始终显示首先是16位代码单元的高字节,读起来更自然。

字节对20 0E是第一个代码单元U+200E(从左到右的标记),00 35是第二个代码单元U+0035(数字{ {1}}。

右边的打印字符用途有限,因为它们是输入字节的 byte 单个解释,只能解释预期的8位范围内的字符(代码点< = 5); U+00FF字节表示为0x0

答案 1 :(得分:0)

$intVar = [int]$intVar

在这种情况下应该可以正常工作。

$intVar.GetType() # String
$intVar = [int]$intVar
$intVar.GetType() # Int32