0
0

More than 3 years have passed since last update.

アラビア数字から漢数字変換

Last updated at Posted at 2021-08-06

アラビア数字から漢数字に変換する処理 備忘録

無量大数って有限だったんだ、、知らんかった

文字列処理でガンバる場合

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)

やっぱり数値計算で処理した方が速かった。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0