適材適所

PowerShellやVBAなどプログラミング系の話多めで

【PowerShell】文字列を数値に変換する

PowerShellはリッチなオブジェクトの受け渡しができる最高のコマンドラインシェルですが、

状況によってはPowerShellのパワフルなコマンドレットではなく、

pingといった古いけれど優秀なコマンドを使うときもあります。

pingなどの歴史あるコマンドの出力はどうしてもプレーンなテキストになってしまいます。

そんなプレーンなテキストを扱っていると、時々文字列から数値に変換したいときが・・・

でもど忘れする・・・。

そんなことを繰り返しているので備忘録も兼ねて書き残しておきます。

文字列を数字に変換する

PowerShellだと、すごく簡単に書くことができます。

PS C:\> [int]"1"
1

こんなに簡単にしてくれてるのになんで忘れるんだろう・・・。

簡単すぎて逆に盲点ですね。

型を調べると

PS C:\> ([int]"1").GetType().FullName
System.Int32

System.Int32型であることがわかります。

つまり

PS C:\> [System.int32]"1"
1

と同義です。

大きい値や小さい値のときは注意

PS C:\> [System.int32]::MaxValue
2147483647

System.Int32型の最大値は2147483647なので、それ以上の数字を変換しようとすると

PS C:\> [int]"2147483648""2147483648" を型 "System.Int32" に変換できません。エラー: "Int32 型の値が大きすぎるか、または小さすぎます。"
発生場所 行:1 文字:1
+ [int]"2147483648"
+ ~~~~~~~~~~~~~~~~~
   + CategoryInfo          : InvalidArgument: (:) []、RuntimeException
   + FullyQualifiedErrorId : InvalidCastFromStringToInteger

と怒られてしまいます。

普段あまりシェルだと意識することは少ないですが(私だけ?)、

コンピュータの中で数字がどのように扱われているか垣間見られる瞬間ですね。

そういうときはlong(System.Int64)型を指定します。

PS C:\> [long]"2147483648"
2147483648

System.Int32の最小の値は-2147483648です。

PS C:\> [int]::MinValue
-2147483648

それ未満の数字を変換しようとするときは、

PS C:\> [double]"-2147483649"
-2147483649

System.Double型が使えます。

ちなみに

ちょっと面倒ですが、これでもok。

PS C:\>[System.Int32]::parse("01")
1

System.Int32のparseメソッドを呼び出しています。

わざわざこんな書き方せずとも[int]で済むので

PowerShellでこれを書くことはないとは思いますが・・・。

一応こんな方法も

さらにこんな方法もあります。

全く意味ないですが、Visual Basicを使うこともできます。

Add-Type -AssemblyName Microsoft.VisualBasic
[Microsoft.VisualBasic.Conversion]::Int("01")

使うことあるんか・・・?

まぁケースバイケースなので、どれを使うかは、お好みで。

終わりに

知ってれば簡単なことですが、

ついつい忘れがちな文字列から数値に変換する方法の紹介でした。

これでプレーンテキストを扱うときも迷わない!!

・・・はず笑

ここまでお読みいただきありがとうございました。

関連記事?

www.tekizai.net

www.tekizai.net