2012年 12月 21日
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