サンプル・プログラムの実行例

サンプル・プログラム
たとえば、「十二万三千四百五十六」を「123456」に変換したいなら「ベタ数字」を、「123,456」に変換したいなら「カンマ区切り」を、「12万3456」に変換したいなら「漢字交じり」を選ぶ。

また、コマンドラインから指定できるようにした。
sourに変換したい漢数字(UTF-8エンコード)を、modeに出力書式(1=カンマ区切り,2=漢字混じり, それ以外=ベタ数字)を指定する。
解説:漢数字を半角数字に変換
199: /**
200: * 漢数字を数値に変換する
201: * @param string $kanji 漢数字
202: * @param int $mode 出力書式/1=3桁カンマ区切り,2=漢字混じり, それ以外=ベタ打ち
203: * @return double 数値
204: */
205: function kan2num($kanji, $mode) {
206: //全角=半角対応表
207: $kan_num = array(
208: '0' => 0, '〇' => 0,
209: '1' => 1, '一' => 1, '壱' => 1,
210: '2' => 2, '二' => 2, '弐' => 2,
211: '3' => 3, '三' => 3, '参' => 3,
212: '4' => 4, '四' => 4,
213: '5' => 5, '五' => 5,
214: '6' => 6, '六' => 6,
215: '7' => 7, '七' => 7,
216: '8' => 8, '八' => 8,
217: '9' => 9, '九' => 9
218: );
219: //位取り
220: $kan_deci_sub = array('十' => 10, '百' => 100, '千' => 1000);
221: $kan_deci = array('万' => 10000, '億' => 100000000, '兆' => 1000000000000, '京' => 10000000000000000);
222:
223: //右側から解釈していく
224: $ll = mb_strlen($kanji);
225: $a = '';
226: $deci = 1;
227: $deci_sub = 1;
228: $m = 0;
229: $n = 0;
230: for ($pos = $ll - 1; $pos >= 0; $pos--) {
231: $c = mb_substr($kanji, $pos, 1);
232: if (isset($kan_num[$c])) {
233: $a = $kan_num[$c] . $a;
234: } else if (isset($kan_deci_sub[$c])) {
235: if ($a != '') $m = $m + $a * $deci_sub;
236: else if ($deci_sub != 1) $m = $m + $deci_sub;
237: $a = '';
238: $deci_sub = $kan_deci_sub[$c];
239: } else if (isset($kan_deci[$c])) {
240: if ($a != '') $m = $m + $a * $deci_sub;
241: else if ($deci_sub != 1) $m = $m + $deci_sub;
242: $n = $m * $deci + $n;
243: $m = 0;
244: $a = '';
245: $deci_sub = 1;
246: $deci = $kan_deci[$c];
247: }
248: }
249:
250: $ss = '';
251: if (preg_match("/^(0+)/", $a, $regs) != FALSE) $ss = $regs[1];
252: if ($a != '') $m = $m + $a * $deci_sub;
253: else if ($deci_sub != 1) $m = $m + $deci_sub;
254: $n = $m * $deci + $n;
255:
256: //出力書式に変換
257: if ($ss == '') {
258: $dest = $n;
259: switch ($mode) {
260: case 1:
261: $dest = number_format($n);
262: break;
263: case 2:
264: $dest = int2kanji($n);
265: break;
266: default:
267: }
268: } else if ($n == 0) {
269: $dest = $ss;
270: } else {
271: $dest = $ss . $n;
272: }
273:
274: return $dest;
275: }
漢数字は、一、二、三‥‥という数字の部分($kan_num)と、位取りの部分に分かれる。
位取りの漢字は、十、百、千のグループ($kan_deci_sub)と、万、億、兆‥‥のグループ($kan_deci)に分かれる。
厄介なのは、「二千九」と「二〇〇九」という2種類の表記ができることである。

そこで、漢数字を右から順に1文字ずつ処理し、$kan_num、$kan_deci_sub、$kan_deci の現れ方によって変数 $n に結果を入れていくことにした。

なお、今回のプログラムは整数しか変換することができない。
参考サイト
- PHPで半角数字を漢数字にする:ぱふぅ家のホームページ
- PHPで漢数字混じりのテキストを半角数字に統一する:ぱふぅ家のホームページ
そこで、「PHPで半角数字を漢数字にする」とは逆に、漢数字や全角数字を半角数字に変換するプログラムを作ってみることにする。
(2021年7月7日)PHP8対応,リファラ・チェック追加,大幅改訂