21. März 2019

Zeichen und Zahlen – Strings und Ints

Nimmt man z.B. folgende Zuweisung:

$a = 1
$b = "1"

So bekommt man bei $a einen Int. Bei $b jedoch einen String. Den Typ einer Variable kann man auslesen, indem man „.GetType()“ dahinter schreibt. Also z.B. $a.GetTyp()

Beide Werte lassen sich in PowerShell trotzdem problemlos „addieren“, nur leider mit unterschiedlichem Ergebnis:

$a + 1

Ergebnis: 2

$b + 1

Ergebnis: 11

Warum? Weil die 1 in $a eine „Zahl“ aber die 1 in $b ein „Zeichen“ (wie ein Buchstabe) ist.

Das erkennt man recht gut, wenn man mittels der eckigen Klammer die einzelnen Elemente der Variablen begutachtet.

$a[0]

Ergebnis: 1

$a[0].GetType()

Ergebnis: Int32

Dasselbe für den String.

$b[0]

Ergebnis: 1

$b[0].GetType()

Ergebnis: Char

Aber was ist das denn jetzt?

Der String $b beschreibt das Objekt als Ganzes. Wenn wir die eckige Klammer dahinter setzen, springen wir in das so-und-so-vielte Element des gesamten Strings. Ein kleines Beispiel:

Mehr dazu erfährst du in „Wie funktionieren Elemente?“

Addieren wir nun als $b + 1 und schreiben das in die Variable $c

$c = $b + 1

So bekommen wir einen String der aus 2 hintereinander folgenden „1“ Zeichen besteht.

Machen wir wieder +1, bekommen wir 3 x das Zeichen 1, etc.

Wenn wir jetzt jedoch wirklich die Zeichenkette „11“ als Zahle „elf“ haben möchten, können wir die Variable entsprechend casten, indem wir den gewünschten Typ in eckige Klammern davor setzen:

[int]$c

Sieht gleich aus… ist aber eine Zahl. Das sehen wir mittels folgendem Befehl.

([int]$c).GetType()

Wir brauche die Klammer um [int]$c damit erst die Variable ale Int gecastet wird, bevor der Operator .GetType() loslegt. Würde man die Klammer weglassen, würde er erst den .GetType von $c machen und dann versuchen diese komplette Ergebnis als Int zu casten, was fehlschlagen wird.

Damit lässt sich rechnen!

[int]$c + 1

Ergebnis: 12

Na endlich.

PowerShell geht aber noch weiter… Denn manchmal interpretiert es sogar Strings unterschiedlich, je nach Operator.

$b

Ergebnis: 1 (String)

$b * 3

Ergebnis: 111 (String)

$b / 2

Ergebnis: 0.5 (Double)

Weil „geteilt durch 2“ definitiv eine mathematische Aktion ist, interpretiert er dafür $b als „Zahl“ und bekommt als Ergebnis ebenfalls eine Zahl, nämlich eine Double.

Jetzt geht es noch einen kleinen Schritt weiter… Rechnet man nun mit diesem Wert weiter, bleibt er bei Double.

($b /2) *2

Wo wir wieder beim Ursprung wären… Ist noch immer ein Double. Somit können wir jetzt die als + 1 machen und bekommen nun nicht mehr „11“ sondern „2“:

Nicht sonderlich alltagstauglich, aber es zeigt die Probleme, die auftreten können, wenn ausversehen Quotes bei Zahlen nutzt oder sonst irgendwie unvorsichtig ist.

Die Unterschiede zwischen, Int32, Int64, Double, Float, etc. entnehmt ihr bitte den Microsoft Artikeln. Google ist dein Freund.