В Powershell каков идиоматический способ преобразования строки в int?
Единственный метод, который я нашел, - это прямой листинг:
> $numberAsString = "10"
> [int]$numberAsString
10
Это стандартный подход в Powershell? Ожидается ли, что тест будет сделан раньше, чтобы убедиться, что преобразование будет успешным, и если да, то как?
Ответы
Ответ 1
Использование .net
[int]$b = $null #used after as refence
$b
0
[int32]::TryParse($a , [ref]$b ) # test if is possible to cast and put parsed value in reference variable
True
$b
10
$b.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
обратите внимание на это (функция принудительной принудительной проверки)
$a = "10"
$a + 1 #second value is evaluated as [string]
101
11 + $a # second value is evaluated as [int]
21
Ответ 2
Вы можете использовать оператор -as. Если премия вернется, вы получите номер:
$numberAsString -as [int]
Ответ 3
Быстрое истинное/ложное испытание того, будет ли оно передаваться в [int]
[bool]($var -as [int] -is [int])
Ответ 4
Для меня $numberAsString -as [int]
of @Shay Levy - лучшая практика, я также использую [type]::Parse(...)
или [type]::TryParse(...)
Но в зависимости от того, что вам нужно, вы можете просто поместить строку, содержащую число справа от арифметического оператора с int слева, результатом будет Int32:
PS > $b = "10"
PS > $a = 0 + $b
PS > $a.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
Вы можете использовать Exception (try/parse), чтобы вести себя в случае проблемы
Ответ 5
Я бы, наверное, сделал что-то вроде этого:
[int]::Parse("35")
Но я не парень Powershell. Он использует статический метод Parse из System.Int32. Он должен вызывать исключение, если строка не может быть проанализирована.
Ответ 6
Настройте ответ на Shavy Levy:
[bool]($var -as [int])
Поскольку $null вычисляется как false (в bool), этот оператор даст вам true или false в зависимости от успеха кастинга или нет.
Ответ 7
$source = "number35"
$number=$null
$result = foreach ($_ in $source.ToCharArray()){$digit="0123456789".IndexOf($\_,0);if($digit -ne -1){$number +=$\_}}[int32]$number
Просто подайте его цифры, и он преобразуется в Int32