冬言響 / 日記

アメコミとか映画とか音楽とか猫とか単車とか自転車とか革とか銀とかジーンズとかブーツとか今日喰ったものとか。

RSS2.0

アラビア数字 to 漢数字 アップデート

アラビア数字から漢数字への変換を小数対応にしてみた。書き加えたのは、まず記事中 1 つ目のコード内の「if($lv != "A") {」の次から。レベル A では単純に並べるだけなので特に処理は増えない。

	// 小数点があった場合。
	if(preg_match("/./", $strIn)) {
		// 小数点以上と以下を切り分ける。
		list($strIn, $strDecimal) = split(".", $strIn);
		// 小数点以下の桁を表す文字テーブル。
		$aryDigitDecimal = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x");
		// 間にアルファベットを挟んでいく。
		for($i = 0; $i < strlen($strDecimal); $i++) {
			$strTmp .= $strDecimal{$i} . $aryDigitDecimal[$i];
			}
		// 0 の後にアルファベットがある場合は削除して $strDecimal に入れる。
		$strDecimal = preg_replace("/0[a-z]/", "", $strTmp);
		// $strTmp を初期化。
		$strTmp = "";
		}

入力文字列内に「.」があったらそこから下を $strDecimal に入れて $strIn は小数点より前の部分だけにする。んで小文字で a、b、c…って具合の配列を作って 1 字ずつ間に挟んでいく。んで 0 の次にアルファベットが来てる部分を削除する。$strTmp を初期化。

次に 3 つ目のコードの最後の方。if($lv != "A") { のスコープを閉じる前に、

	// 小数点以下の文字列がある場合はそれを接続(2008-12-22 追記)
	if($strDecimal) {
		$strIn .= "." . $strDecimal;
		}

$strDecimal が存在してる場合は「.」を挟んで $strIn に戻す。

最後にアラビア数字・アルファベットを漢数字に変換するための配列に、小数点及びそれ以下の桁の文字を追加する。

foreach(array(
	// (略)
	"." => "・", "a" => "分", "b" => "厘", "c" => "毛",
	"d" => "糸", "e" => "忽", "f" => "微", "g" => "繊",
	"h" => "沙", "i" => "塵", "j" => "埃", "k" => "渺",
	"l" => "漠", "m" => "模糊", "n" => "逡巡", "o" => "須臾",
	"p" => "瞬息", "q" => "弾指", "r" => "刹那", "s" => "六徳",
	"t" => "虚空", "u" => "清浄", "v" => "阿頼耶", "w" => "阿摩羅",
	"x" => "涅槃寂静") as $key => $value) {

レベル A でも B でも C でも小数点としての「・」を間に挟んでるのだけどたぶん正しくはないんだよなこれ。Wikipedia によると間に単位を挟んで「二寸三分四厘」のように表記するらしいのだが単位が定められてない場合はどうするんだろう。

漢数字 to アラビア数字の小数対応はもうちょっと後。数値として扱ってると極端に大きな値の場合にオーバーフロー起こしたりしてしまうぽいので単純に文字列として接続していくやり方に書き直したいので、その後で。

あんま追記とかしてるとごちゃごちゃになってしまうな。いずれ別ページにまとめよう。