PowerShellはリッチなオブジェクトの受け渡しができる最高のコマンドラインシェルですが、状況によってはPowerShellのパワフルなコマンドレットではなく、pingといった古いけれど軽量で優秀なコマンドを使うときもあります。
pingなどの歴史あるコマンドの出力はどうしてもプレーンなテキストになってしまいます。
そんなプレーンなテキストを扱っていると、時々文字列から数値に変換したいときが・・・
でもど忘れする・・・。
そんなことを繰り返しているのでPowerShellで文字列型を数値型に変更する方法を備忘録も兼ねて書き残しておきます。
文字列を数字に変換する
PowerShellだと、すごく簡単に書くことができます。
#文字列 1 を数字に変換する [int]"1"
こんなに簡単にしてくれてるのになんで忘れるんだろう・・・。
簡単すぎて逆に盲点ですね。
型を調べると
([int]"1").GetType().FullName
結果
System.Int32
System.Int32型であることがわかります。
つまり
#文字列 1を数値に変換する [System.int32]"1"
と同義です。
大きい値や小さい値のときは注意
System.Int32型の最大値は2147483647です。
#System.int32最大値2147483647が表示される [System.int32]::MaxValue
それ以上の数字を変換しようとすると
[int]"2147483648"
値 "2147483648" を型 "System.Int32" に変換できません。エラー: "Int32 型の値が大きすぎるか、または小さすぎます。" 発生場所 行:1 文字:1 + [int]"2147483648" + ~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) []、RuntimeException + FullyQualifiedErrorId : InvalidCastFromStringToInteger
と怒られてしまいます。
普段あまりシェルだと意識することは少ないですが(私だけ?)、コンピュータの中で数字がどのように扱われているか垣間見られる瞬間ですね。
そういうときはlong(System.Int64)型を指定します。
[long]"2147483648"
ちなみにSystem.Int32の最小の値は-2147483648です。
[int]::MinValue
それ未満の数字を変換しようとするときは、
[double]"-2147483649"
System.Double型が使えます。
ちなみに
ちょっと面倒ですが、数字を文字列に変換するときは、これでもok。
[System.Int32]::parse("01")
System.Int32のparseメソッドを呼び出しています。
わざわざこんな書き方せずとも[int]で済むので
PowerShellでこれを書くことはないとは思いますが・・・。
一応こんな方法も
さらにこんな方法もあります。
全く意味ないですが、Visual Basicを使うこともできます。
Add-Type -AssemblyName Microsoft.VisualBasic [Microsoft.VisualBasic.Conversion]::Int("01")
使うことあるんか・・・?
まぁケースバイケースなので、どれを使うかは、お好みで。
終わりに
知ってれば簡単なことですが、
ついつい忘れがちな文字列から数値に変換する方法の紹介でした。
これでプレーンテキストを扱うときも迷わない!!
・・・はず
ここまでお読みいただきありがとうございました。