Clojureで文字列を整数にする
4Clojureで数値の各桁をゴニョゴニョするという問題に何度か遭遇しました。
各桁に対して何か処理をしようとする時は、文字列が文字のシーケンスで、シーケンス系の関数を適用できるシーケンシャルな型であることを知っていれば、一旦、数値を文字列にしてからシーケンス処理して、数値に戻すという発想が思いつきます。
数値を文字列に変換するのは、str
関数を適用すれば良いだけなので簡単です。
その後、mapなりで処理して、数値に戻す時が問題です。数値を文字列にする関数は、先ほど書いたように、str
関数が用意されているのですが、数値を文字列にする関数は、ClojureDocsを見る限り見当たりません。
ググってみると、JavaのInteger/parseInt
で変換すると書いてあるものがほとんどで、何か負けた気がしました。高階関数にそのまま渡すこともできませんし。
4Clojureの回答で見つけた例
数値の各桁に対してゴニョゴニョする問題の回答例を見てみると、str
関数を使う例が案の定ほとんどだったのですが、文字列を数値のシーケンスする処理で不思議なコードを見かけました。
#(- (int %) (int \0))
何やってんだろ?ということで実際実行してみると、(int \0)
は48という数値を返しました。
実際の数値を当てはめてみて
(- (int \9) (int \0))
と実行してみたら、9を返しました。これでなんとなくやってることの意味がわかったんですが、char
をint
で変換すると、文字コード番号を返すようです。
それを利用して、数値の文字の文字コード番号から、0の文字コード番号を引いて、数値の文字を数値そのものに変換しているということなんですね。
0の文字コード番号が48で、9の文字コード番号が57なので、その差を取れば、9になります。
目からうろこでした。
そもそも
そもそも、自分が知らなかっただけで、文字(数値)を数値に変換する時に、よく使われるテクニックのようです。知らないテクニックを遊びながら学べる4Clojureは本当に素晴らしいですね。
文字列を整数に変換する関数
ということで、上記のテクニックを使って、文字列を整数に変換する関数を実装してみました。
こんな感じになりました。