Pytanie W Powershell jaki jest idiomatyczny sposób konwersji ciągu znaków na int?


Jedyną metodą, którą znalazłem, jest bezpośrednia obsada:

> $numberAsString = "10"
> [int]$numberAsString
10

Czy to standardowe podejście w Powershell? Czy oczekuje się, że test zostanie wykonany wcześniej, aby upewnić się, że konwersja się powiedzie, a jeśli tak, to w jaki sposób?


44
2018-03-14 11:00


pochodzenie




Odpowiedzi:


Korzystanie z .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

zauważ to (funkcja wymuszania powłoki)

$a = "10"
$a + 1 #second value is evaluated as [string]
101 

11 + $a # second value is evaluated as [int]
21

47
2018-03-14 11:13



funkcja przymusu działa dla mnie! Dzięki - dopplesoldner
@dopplesoldner Cieszę się, że mogę pomóc! - CB.
Ciekawe, że jednoargumentowe + działa również dla mnie: + $ numberAsString. - Alexander Kellett


Możesz użyć operatora -as. Jeśli rzutowanie powiedzie się, otrzymasz z powrotem numer:

$numberAsString -as [int]

55
2018-03-14 11:39



Jeśli rzutowanie nie powiedzie się, zawsze zwracaj wartość INT "0"! - CB.
W rzeczywistości, jeśli rzutowanie nie powiedzie się, zwróci $ null. Jeśli następnie rzucisz to na [int] (niejawnie lub jawnie), otrzymasz 0. - mjolinor
@mjolinor. rigth! Przetestowałem to z ukrytą wersją var! Dzięki - CB.
Nie zawsze, starając się znaleźć dobre wyjaśnienie, dlaczego [int] "" lub "" -as [int] zwraca 0. "foo" -as [int] nic nie daje. - Shay Levy
Wygląda na to, że PS wymusza zerowy na int. [int] '' i [int] $ null również zwraca 0. (zrzeczenie się - WAG podąża) => Wygląda na to, że może to być sposób, w jaki potok zwraca wyniki skalarne / tablicowe. $ count + = $ _. count będzie zawsze działać niezależnie od tego, czy $ _ jest tablicą czy skalarem. - mjolinor


Szybki test prawdziwej / fałszywej tego, czy będzie rzutowany na [int]

[bool]($var -as [int] -is [int])

12
2018-03-14 11:37





Dla mnie $numberAsString -as [int] @Shay Levy to najlepsza praktyka, ja też używam [type]::Parse(...) lub [type]::TryParse(...)

Ale, w zależności od tego, czego potrzebujesz, możesz po prostu umieścić ciąg znaków zawierający cyfrę po prawej stronie operatora arytmetycznego z int po lewej stronie wynikiem będzie Int32:

PS > $b = "10"
PS > $a = 0 + $b
PS > $a.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

Możesz użyć wyjątku (try / parsować), aby zachować się w przypadku problemu


8
2018-03-14 13:00





Prawdopodobnie zrobiłbym coś takiego:

[int]::Parse("35")

Ale nie jestem facetem z Powershell. Używa statycznej metody Parse z System.Int32. Powinien rzucić wyjątek, jeśli nie można przeanalizować łańcucha.


3
2018-03-14 11:11





W oparciu o odpowiedź Shavy Levy:

[bool]($var -as [int])

Ponieważ $ null jest wartościowane na false (w bool), to stwierdzenie da ci wartość true lub false w zależności od tego, czy rzutowanie się powiedzie, czy nie.


0
2018-03-08 13:47



Nie zgadzać się: [bool]('0' -as [int]) zwraca false mimo że '0' -as [int] odnosi sukcesy! - JosefZ


$source = "number35"

$number=$null

$result = foreach ($_ in $source.ToCharArray()){$digit="0123456789".IndexOf($\_,0);if($digit -ne -1){$number +=$\_}}[int32]$number

Po prostu wprowadź cyfry i przekonwertuj na Int32


-2
2017-11-21 18:46