Perlリファレンス

数字を3桁ごとにカンマで区切る







数字を3桁ごとにカンマで区切る


$num=~s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;
正規表現の拡張構文を使って1行でできます。

まず、
(\d{1,3})
が、数字1-3桁にマッチ。
一致した場合は$1はこの部分の数値となる。

(?=(?:\d{3})+(?!\d))
続く部分は拡張構文なので一致の確認は行うが置換対象にはならない。
拡張構文の中にさらに拡張構文が入ってます。

(?:\d{3})+
数字3の倍数桁に一致。

(?!\d)
続く文字が数字以外。



$num=1234567890;
$num=~s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;
一番最後の文字が数字以外に一致ですので、末尾のみ一致する。
その前が数字3桁の倍数890、567、234、に一致。
その前の1-3桁の数字は「1」ですので、$1==1。
これで「1」が「1,」に置換される。
gオプションで連続置換されますので、残りの「234567890」を同じように置換する。
結果、「1,234,567,890」に置換される。


関連






[編集] [新規] [削除] [バックアップ] [アップロード] [ログイン] [管理]
whwiki 1.3