数を漢数字の文字列にしてみよう(2)


2012年 12月 21日

Haskells.jpgのサムネール画像

1234567890を”12億3456萬7890″にするところまではできた。
残りは、1?9999を漢数字に直すことだ。
まず、そのために、漢字のリストを2つ追加した。

kurai,kuraisub,suuji  :: [String]
kurai    = ["","萬","億","兆","京","垓","秭","穰","溝","澗","正"]
kuraisub = ["","拾","陌","阡"]
suuji    = ["","壱","弐","参","四","五","六","七","八","九"]

これを使って、まず、拾、陌、阡、(十、百、千)を処理してみよう。
これは、萬、億、兆、京、、、、のときと同様の処理で済むはず。
ということで、

combinedig   1桁の数字と位の数字をくっつける関数
konvertsub     1?9999を文字列に直す関数

を作った。それぞれ、combine、 konvert にそっくりである。

combinedig :: (Int,String) -> String
combinedig (n,s)
    | n == 0     = ""
    | otherwise  = show n ++ s

konvertsub :: Int -> String
konvertsub n = concat (map combinedig (reverse (zip (reverse (splits 10 n [])) kuraisub)))

今まで、combineで、1?9999の数字を文字列に直すところが show n となっていたが、これを konvertsub n に変更すれば、位の漢字が全部出てくるはずだ。

combine :: (Int,String) -> String
combine (n,s)
    | n == 0     = ""
    | otherwise  = konvertsub n ++ s

さて、実行するとどうなるか。

*Main> putStrLn (konvert 1234567890)
1拾2億3阡4陌5拾6萬7阡8陌9拾

さて、残りは、1?9の数字を漢字に直すことだ。
show n で数字を出していたところを、漢数字壱?九のリストsuujiのn番目の漢字に直せば良いだろう。

combinedig (n,s)
    | n == 0     = ""
    | otherwise  = suuji!!n ++ s

さて、実行してみよう。

*Main> putStrLn (konvert 1234567890)
壱拾弐億参阡四陌五拾六萬七阡八陌九拾

ちゃんと動くようだ。今日は、ここまで。

ここまでのプログラム konvert2.hs