"¥12,000"といったような日本円書式の文字列を数値に変換したい。
この処理が今日まさに必要になって調べてみたんですが、意外とスマートに解決する方法が見つからなかったので、そこそこ調べた中から最善と思われる方法を3つ紹介しておきます。
方法1:数値以外を置換して取り除く
検索では十中八九、この方法がヒットします。
正規表現などを使って数値以外の文字を除去し数値だけの文字列にしてからintに変換するやり方です。
>>> int('¥12,000'.replace('¥', '').replace(',', ''))
12000
>>> import re
>>> int(re.sub(r'¥|,', '', '¥12,000'))
12000
多くの人がこの書き方で満足しているようですが、そんなにスマートな方法だとは思えないので僕のなかでは即却下でした。
方法2:localeモジュールを使う
localeモジュールは、国際間での日付やお金の表現の違いを適切に吸収することを意図したものです。
日本円を扱う場合はロケールカテゴリLC_MONETARYを"ja_JP"に設定したうえでlocale.atoi()やlocale.currency()を呼び出します。
>>> import locale
>>> locale.setlocale(locale.LC_MONETARY, 'ja_JP')
>>> locale.atoi('12,000')
12000
>>> locale.atoi('¥12,000')
ValueError
>>> locale.currency(12000)
'¥12000'
locale.atoi()では"12,000"というカンマ区切りの文字列を数値にすることはできますが、"¥12,000"のように「¥」記号が入るとエラーになってしまいます。かなり中途半端な実装です。
逆に数値から文字列にする場合は「¥」記号を入れてくれます。
実装が中途半端なうえにlocaleモジュールにロケールを設定する処理がプログラム全体に影響してしまう(スレッドセーフではない)ことと、その処理コストも大きいオペレーションのため、あまり使い勝手がいいとは言えません。
方法3:yen-parserを使う
"¥12,000"といった「¥」記号が入っている文字列をパースしてくれるライブラリが見つからなかったので、yen-parserというライブラリを作りました。
日本円書式の文字列を数値に変換する機能だけのライブラリで、関数呼び出し1つで手軽に変換することができます。
インストール
pip install yen-parser
parse_yen()関数に文字列を指定するだけです。
>>> from yen_parser import parse_yen
>>> parse_yen('¥12,000')
12000
ちなみに、変換できない文字列を指定するとValueErrorが出力されます。