昔読んだC言語の本に、文字列を整数値に変換する関数「atoi()」のソースコードが掲載されており、こんな短いコードで実現できるかと感動した覚えがあります。
探せばその本を今でも発掘することが出来るとは思いますが、プログラミングの勉強としてPowerShellで「atoi()」を作成してみたいと思います。
文字列を1文字ごとに分解し、左側から数字か判定し、数字の場合変数に加算します。その際事前に代入されている変数の値を10倍することで、数値の各桁を表現することが出来ます。
文字である数字を整数の数値に変換する方法として、数字に当たる文字0~9の文字コード(ASCII)が連続していることを利用し、対象文字コードから0の文字コードを減算することで各桁の数値を取り出す方法があります。ただ文字コードに関するプログラミングはするのは自分には難しいので文字の数分条件分岐を書くことにします。
あと、整数値はマイナスの場合もありますので、マイナスも判定できるようにする必要があります。
function atoi
{
param([string]$numstr)
$len = $numstr.Length
$result = 0
$sine_flag = 1
for($i = 0; $i -lt $len; $i += 1) {
$c = $numstr[$i]
if ($c -eq "-") {
$sine_flag = -1
} elseif ($c -eq "0") {
$result = $result * 10
} elseif ($c -eq "1") {
$result = $result * 10 + 1
} elseif ($c -eq "2") {
$result = $result * 10 + 2
} elseif ($c -eq "3") {
$result = $result * 10 + 3
} elseif ($c -eq "4") {
$result = $result * 10 + 4
} elseif ($c -eq "5") {
$result = $result * 10 + 5
} elseif ($c -eq "6") {
$result = $result * 10 + 6
} elseif ($c -eq "7") {
$result = $result * 10 + 7
} elseif ($c -eq "8") {
$result = $result * 10 + 8
} elseif ($c -eq "9") {
$result = $result * 10 + 9
}
}
return ($result * $sine_flag)
}
$numstr = "-123456789"
$num = atoi($numstr)
if ($num -eq [Int]$numstr) {
Write-Host "OK"
} else {
Write-Host "NG"
}
確認のため文字列をIntにキャストした値と比較しています。
結果がOKと表示されましたので思った通りに出来ていると思われます。
多量のif文とマイナスの判定部分を何とかしたいところです。
コメント