dinsdag 16 april 2013

Veilig strings converteren naar getal



Om een string veilig te converteren naar een getal zijn er een aantal mogelijkheden. Dit geldt met name voor waarde zoals bewaard in het veld 'EmployeeID' of 'Description' in een Active Directory user object, die tekst of getallen kunnen bevatten.

Plat converteren naar getal:

$waarde = [int]$user.description

Dit gaat fout zodra de variabele een waarde bevat die niet om te zetten is naar een getal. Dit gooit een RuntimeException . Het is veiliger om dit in een try..catch block te zetten.

try {
 $idval = [int]$user.description
}
catch {
 $idval = -1
}
Een niet-numerieke waarde geeft een negatief getal in $idval of iets anders, wat je maar wilt.

Analoog hieraan is de [System.Convert] class. Deze class bevat diverse conversiefuncties voor [int] en [double] en alle ander .NET-types.

$idval = [System.Convert]::ToInt32($user.description)
Dit geeft een nette DotNetMethodException wanneer de tekst geen numerieke waarde oplevert.

Een heel nette oplossing is de volgende.

$idval = $user.description -as [int]
Bij niet-nummers geeft dit waarde $null.

Om even snel te testen of de cast naar int slaagt, gebruik:

[bool]($var -as [int] -is [int])
Maar let op! Zelfs wanneer $var $null bevat, levert dit True!

Geen opmerkingen:

Een reactie posten