我正在尝试使用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
答案 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