アラビア数字から漢数字に変換する処理 備忘録
無量大数って有限だったんだ、、知らんかった
文字列処理でガンバる場合
d1 = {u'1': u'一', u'2': u'二', u'3': u'三', u'4': u'四', u'5': u'五', u'6': u'六', u'7': u'七', u'8': u'八', u'9': u'九'}
d3 = {1: u'十', 2: u'百', 3: u'千'}
d4 = {4: u'万', 8: u'億', 12: u'兆', 16: u'京', 20: u'垓', 24: u'予', 28: u'穣', 32: u'溝', 36: u'潤',
40: u'正', 44: u'載', 48: u'極', 52: u'恒河沙', 56: u'阿僧祇', 60: u'那由他', 64: u'不可思議', 68: u'無量大数'}
def int2kanji(integer):
sio = str(integer)
i = len(sio) - 1
ret = u""
for s in sio:
mod4 = i % 4
if (mod4 == 0):
ret += d1.get(s, u"")
ret += d4.get(i, u"")
elif (s != u'0'):
if s != u'1':
ret += d1.get(s, s)
ret += d3.get(mod4, u"")
i -= 1
return ret
int2kanji(110304567) # -> 一億千三十万四千五百六十七
In [2]: %timeit int2kanji(110304567)
2.69 µs ± 96.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
数値計算で頑張る場合
d1 = [u'', u'一', u'二', u'三', u'四', u'五', u'六', u'七', u'八', u'九']
D3_U = [u'十', u'百', u'千']
D4_U = [u'', u'万', u'億', u'兆', u'京', u'垓', u'予', u'穣', u'溝', u'潤', u'正', u'載', u'極', u'恒河沙', u'阿僧祇', u'那由他', u'不可思議', u'無量大数']
def int2kanji(i):
if (i == 0):
return "零"
mod = i % 10
ret = ""
for d4 in D4_U:
ret = d4 + ret
if (mod):
ret = d1[mod] + ret
i //= 10
if (i == 0):
break
mod = i % 10
for d3 in D3_U:
if (mod):
ret = d3 + ret
if (mod != 1):
ret = d1[mod] + ret
i //= 10
if (i == 0):
break
mod = i % 10
if (i == 0):
break
return ret
int2kanji(110304567) # -> 一億千三十万四千五百六十七
In [4]: %timeit int2kanji(110304567)
1.94 µs ± 5.78 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops
each)
やっぱり数値計算で処理した方が速かった。