サンプル・プログラムの実行例
サンプル・プログラム
num2kanji.php | サンプル・プログラム本体。 |
変換ルール(1)通常記法
148: /**
149: * 半角数字を漢数字に変換する(通常記法)
150: * @param string $instr 半角数字
151: * 小数、負数に対応;指数表記には未対応
152: * カンマは無視
153: * @return string 漢数字
154: */
155: function num2kan_normal($instr) {
156: static $kantbl = array(0=>'〇', 1=>'一', 2=>'二', 3=>'三', 4=>'四', 5=>'五', 6=>'六', 7=>'七', 8=>'八', 9=>'九', '.'=>'.', '-'=>'-');
157:
158: $outstr = '';
159: $len = strlen($instr);
160: for ($i = 0; $i < $len; $i++) {
161: $ch = substr($instr, $i, 1);
162: if ($ch == ',') continue; //カンマは無視
163: $outstr .= (isset($kantbl[$ch]) ? $kantbl[$ch] : '');
164: }
165:
166: return $outstr;
167: }
この処理は、ユーザー関数 num2kan_normal が担当している。
プログラム的には難しいものではない。引数を1文字ずつ取り出して、対応する漢数字に置き換えているだけである。
置換テーブルは連想配列 $kantbl として用意し、変換元文字を添字に、変換後の文字を変数値としている。こういう時に連想配列は便利である。
変換ルール(2)位取り記法
169: /**
170: * 半角数字を漢数字に変換する(位取り記法)
171: * @param string $instr 半角数字
172: * 小数、負数に対応;指数表記には未対応
173: * カンマは削除
174: * @return string 漢数字
175: */
176: function num2kan_decimal($instr) {
177: static $kantbl1 = array(0=>'', 1=>'一', 2=>'二', 3=>'三', 4=>'四', 5=>'五', 6=>'六', 7=>'七', 8=>'八', 9=>'九', '.'=>'.', '-'=>'-');
178: static $kantbl2 = array(0=>'', 1=>'十', 2=>'百', 3=>'千');
179: static $kantbl3 = array(0=>'', 1=>'万', 2=>'億', 3=>'兆', 4=>'京');
180:
181: $outstr = '';
182: $len = strlen($instr);
183: $m = (int)($len / 4);
184: //一、万、億、兆‥‥の繰り返し
185: for ($i = 0; $i <= $m; $i++) {
186: $s2 = '';
187: //一、十、百、千の繰り返し
188: for ($j = 0; $j < 4; $j++) {
189: $pos = $len - $i * 4 - $j - 1;
190: if ($pos >= 0) {
191: $ch = substr($instr, $pos, 1);
192: if ($ch == ',') continue; //カンマは無視
193: $ch1 = isset($kantbl1[$ch]) ? $kantbl1[$ch] : '';
194: $ch2 = isset($kantbl2[$j]) ? $kantbl2[$j] : '';
195: //冒頭が「一」の場合の処理
196: if ($ch1 != '') {
197: if ($ch1 == '一' && $ch2 != '') $s2 = $ch2 . $s2;
198: else $s2 = $ch1 . $ch2 . $s2;
199: }
200: }
201: }
202: if ($s2 != '') $outstr = $s2 . $kantbl3[$i] . $outstr;
203: }
204:
205: return $outstr;
206: }
漢数字の位取りは4桁毎である。すなわち、「一、十、百、千」の4桁で回るループと、その外側の「一、万、億、兆‥‥」の2つの組み合わせからなる。
さらに、一の位以外で「一」があらわれる場合は、これを無視する。「一百万」「一十億」とは記さないからである。
これをプログラムにしたのがユーザー関数 num2kan_decimal である。
正規表現による置換
291: //変換
292: if (isButton('exec')) {
293: //位取記法
294: if ($mode['decimal'] != '') {
295: $dest = preg_replace_callback('/[0-9.\.\-\,]+/msu',
296: function ($mt) {
297: return num2kan_decimal($mt[0]);
298: }, $sour
299: );
300: //通常記法
301: } else {
302: $dest = preg_replace_callback('/[0-9.\.\-\,]+/msu',
303: function ($mt) {
304: return num2kan_normal($mt[0]);
305: }, $sour
306: );
307: }
308: }
関数 preg_replace_callback は、正規表現でマッチした部分文字列をユーザー関数(ここでは num2kan_normal と num2kan_decimal)に渡すことができる。
参考サイト
- PHPで日本語テキストを正規化:ぱふぅ家のホームページ
しかし、スタイルとして縦書き用フォントを適用しても、半角数字を縦書きにすることはできない。組文字を使うなどの手はあるが、やはり漢数字で縦書きにした方が見やすい。
そこで今回は、半角数字を漢数字に変換するPHPプログラムを作ってみることにする。
(2021年5月30日)PHP8対応,リファラ・チェック追加