いちいち書き換えるのは面倒だし、間違えやすい。そこは計算機に任せよう。
perlの先後読み正規表現を使って、単位語を入れる位置を指定すれば、意外に簡単かも。ちゃんと動くかな?
#!/usr/bin/perl
# utf-8テキストを扱うまじない
use utf8;
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';
while (<>) {
# 数字は半角にそろえておく
y/1234567890/1234567890/;
# 単独の0は「ゼロ」に書き換える
s/(?<!\d)0(?!\d)/ゼロ/g;
# 桁区切りのコンマを取っておく
s/(?<=\d),(?=(\d\d\d)+(?!\d))//g;
# 4桁ごとに区切って万億兆を挿入
s/(?<=\d)(?=\d\d\d\d(?!\d))/万/g;
s/(?<=\d)(?=\d\d\d\d(?=万))/億/g;
s/(?<=\d)(?=\d\d\d\d(?=億))/兆/g;
# 下から1桁ずつ十百千を挿入
s/(?<=\d)(?=\d(?!\d))/十/g;
s/(?<=\d)(?=\d(?!\d))/百/g;
s/(?<=\d)(?=\d(?!\d))/千/g;
# 0になってる桁を削除
s/0[十百千]//g;
s/億0万/億/g;
s/兆0億/兆/g;
s/0//g;
# 十百には1をつけない
s/1([十百])/\1/g;
# 各桁を漢数字に書き換え
y/123456789/一二三四五六七八九/;
print $_;
}
6月25日 修正:「0万」「0億」が消えてしまってはよくない場合があるので、「億0万」「兆0億」の場合だけ消えるようにした。
7月10日 改訂:もとの洋数字がコンマ区切りでも変換でるように、コンマ消去の処理を最初に付け加えた。ただしく3桁ごとに区切ってないとうまく変換できないけど、後にコンマが残るので、もとの桁区切りがおかしかったことがわかっていいかな。
10月13日 修正:「海抜0m地帯」なども0が消えてはいけないし、こういったものは縦書きだと「ゼロ」と書くことが多いので、そんな場合に対応できるようにした。
未来の自分のためにちょっとメモ:
(?<=\d)(?=\d\d\d\d(?!\d))は、
《後読み》
後ろをちょっと振り返えれば
(?<= )
数字
\d
がひとつは見えて (?<=\d)
《先読みと否定先読み》
先を望めば
(?= )
数字がよっつ見えて
\d\d\d\d
さらにその先は数字じゃない
(?!\d)
(←もちろん、文字がなくてもかまわない)(?=\d\d\d\d(?!\d))
そういう場所。
文字じゃなくて場所だってところが味噌。
組版的には字間かな。
0 件のコメント:
コメントを投稿