先日、「ローマ数字とアラビア数字の互換」について投稿しました。
http://qiita.com/xuyun19840618/items/512600a37db522589cee
本日、漢数字とアラビアの互換について、自己流を紹介します。
単位
漢数字の単位をメイン単位とサブ単位に分けます。
###メイン単位
10の4乗で一区切りとして、メイン単位は下記になります。
漢数字 | arabic |
---|---|
一 | 10の0乗 |
万 | 10の4乗 |
億 | 10の8乗 |
兆 | 10の12乗 |
京 | 10の16乗 |
垓 | 10の20乗 |
秭 | 10の24乗 |
穣 | 10の28乗 |
溝 | 10の32乗 |
澗 | 10の36乗 |
正 | 10の40乗 |
載 | 10の44乗 |
極 | 10の48乗 |
恒河沙 | 10の52乗 |
阿僧祇 | 10の56乗 |
那由他 | 10の60乗 |
不可思議 | 10の64乗 |
無量大数 | 10の68乗 |
###サブ単位
漢数字 | arabic |
---|---|
一 | 1 |
十 | 10 |
百 | 100 |
千 | 1000 |
##説明
###アラビア数字から漢数字へ
例:12345678
12345678 = 1234 * 10^4 + 5678 * 10^0 = 1234 万 + 5678
1234 = 1 * 1000 + 2 * 100 + 3 * 10 + 4 = 千二百三十四
同じく
5678 = 五千六百七十八
なので、
12345678 = 千二百三十四万五千六百七十八
###漢数字からアラビア数字へ
例:千二百三十四万五千六百七十八
千二百三十四万五千六百七十八 = 千二百三十四 万 五千六百七十八
そのうち、
千二百三十四 = 1000 + 2 * 100 + 3 * 10 + 4 = 1234
五千六百七十八 = 5678
なので、
千二百三十四万五千六百七十八 = 1234 * 10^4 + 5678 = 12345678
演習
>>> ArabicToJapanese(324562123124688965059)
>>> 三垓二千四百五十六京二千百二十三兆千二百四十六億八千八百九十六万五千五十九
>>> ArabicToJapanese('IV')
>>> 'error'
>>> JapaneseToArabic('一京')
>>> 10000000000000000
コード
japanese_1 = '無','不','那','阿','恒','極','載','正','澗','溝','穣','秭','垓','京','兆','億','万',''
# 無は無量大数 不は不可思議 那は那由他 阿は阿僧祇 恒は恒河沙
japanese_2 = '千','百','十',''
japanese_3 = '九','八','七','六','五','四','三','二','一',''
japanese_4 = '無量大数','不可思議','那由他','阿僧祇','恒河沙'
lenth = len(japanese_1), len(japanese_2), len(japanese_3)
def ArabicToJapanese(arabic):
if not isinstance(arabic, int) or arabic <= 0:
return 'error'
japanese = ''
for j_1 in japanese_1:
index_1 = japanese_1.index(j_1)
a_1 = 10 ** ( (lenth[0] - 1 - index_1) * 4 )
n = arabic // a_1
if n > 0:
arabic %= a_1
for j_2 in japanese_2:
index_2 = japanese_2.index(j_2)
a_2 = 10 ** (lenth[1] - 1 - index_2)
k = n // a_2
if k > 0:
if k == 1 and a_2 != 1:
japanese += j_2
else:
index_3 = lenth[2] -1 - k
japanese += japanese_3[index_3] + j_2
n %= a_2
japanese += j_1
for a,b in zip(japanese_4,japanese_1[0:5]):
japanese = japanese.replace(b,a)
return japanese
def JapaneseToArabic(japanese):
if not isinstance(japanese, str):
return 'error'
for a,b in zip(japanese_4,japanese_1[0:5]):
japanese = japanese.replace(a,b)
for j in japanese:
if j not in japanese_1 and j not in japanese_2 and j not in japanese_3:
return 'error'
value = 0
for j_1 in japanese_1:
if j_1 in japanese:
index = japanese.index(j_1)
if index != 0:
ja = japanese[0 : index]
japanese = japanese[(index+1) : ]
else:
ja = japanese[0 : ]
value_1 = 0
for j_2 in japanese_2:
if j_2 in ja:
ix = ja.index(j_2)
if ix != 0:
value_2 = lenth[2] -1 - japanese_3.index(ja[0 : ix])
ja = ja[(ix+1) : ]
else:
if j_2 != '':
value_2 = 1
ja = ja[(ix+1) : ]
if j_2 == '':
value_2 = lenth[2] -1 - japanese_3.index(ja)
value_1 += value_2 * 10 ** (lenth[1] - 1 - japanese_2.index(j_2))
value += value_1 * 10 ** ( (lenth[0] - 1 - japanese_1.index(j_1)) * 4 )
return value