Не удается преобразовать строку в int в PowerShell - PullRequest
3 голосов
/ 05 марта 2019

Я пытаюсь преобразовать строку в целое число с помощью 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)

И результат:

Исключительная ситуация, вызывающая "ToInt32" с аргументом (ами) "2": "Не удалось найти какие-либо распознаваемые цифры."

И третий метод, который я пробовал:

$converted = $intVar / 1

И результат:

Невозможно преобразовать значение "5" в тип "System.Int32". Ошибка: «Входная строка была в неправильном формате.»

Если я вручную присваиваю $intVar значение «5» ($intVar = "5"), все работает просто отлично, поэтому я думаю, что должна быть проблема с тем, как я получаю значение. Но я понятия не имею, что могу делать неправильно, поскольку GetType() говорит, что это действительно строка.

РЕДАКТИРОВАТЬ: В ответ TobyU я также пытался $intVar = [int]$intVar, с тем же результатом

Невозможно преобразовать значение "5" в тип "System.Int32". Ошибка: «Входная строка была в неправильном формате.»

РЕДАКТИРОВАТЬ: Еще один метод:

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

Что дает:

Исключение вызывает "Parse" с аргументом (ами) "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 ]

3 голосов
/ 05 марта 2019

Изучение сообщений об ошибках в исходном тексте вашего вопроса показывает, что ваша строка содержит невидимый символ LEFT-TO-RIGHT-MARK Unicode (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 (цифра 5).

Печатные символы справа имеют ограниченную полезность, поскольку они представляют собой байт -индивидуальную интерпретацию входных байтов, которая отображает только символы в 8-битном диапазоне, как и ожидалось (кодовые точки <= <code>U+00FF); 0x0 байт представлен как .

0 голосов
/ 05 марта 2019
$intVar = [int]$intVar

в этом случае должно работать нормально.

$intVar.GetType() # String
$intVar = [int]$intVar
$intVar.GetType() # Int32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...