|
发表于 2018-3-21 10:58:11
|
显示全部楼层
本帖最后由 天圆突破 于 2018-3-21 12:28 编辑
加了点难度,支持10**28-1以内的数字转换,汉字数字好像只能这么大,再大就没有单位了。
- import re
- class Hanzi:
- def __init__(self):
- pass
- def _change(self, s):
- def inner(num):
- if num == 0:
- return ''
- else:
- lst = list('千百十')
- dct = dict(zip([str(i) for i in range(10)], list('零一二三四五六七八九')))
- num = [dct[i] for i in list(str(num))]
- num[0] = (len(num) != 2 or num[0] != '一') * num[0]
- n = len(num)
- if n <= 4:
- for i in range(n - 1, 0, -1):
- num.insert(i, (num[i - 1] != '零') * lst[i + 3 - n])
- num = re.sub('零+', '零', ''.join(num))
- if num[-1] == '零':
- num = num[:-1]
- return num
- jin = ['', '万', '亿', '兆', '京', '垓', '秭']
- if s > 10 ** 28 - 1:
- return s
- else:
- s, slst, i = str(s), list(), 1
- while s != '':
- slst.append(int(s[-4:]))
- s = s[:-4]
- s = list()
- for i in range(len(slst)):
- if slst[i] == 0:
- s.insert(0, '零')
- elif len(slst) == 1:
- s.insert(0, inner(slst[i]))
- elif 0 < slst[i] < 1000 and i != len(slst) - 1:
- s.insert(0, '零' + inner(slst[i]) + jin[i])
- else:
- s.insert(0, inner(slst[i]) + jin[i])
- return re.sub('零+', '零', ''.join(s))
- def __call__(self, func):
- def _call(arg):
- res = func(arg)
- return self._change(res)
- return _call
- class Fib:
- def __init__(self):
- self.a , self.b = 0, 1
- def __iter__(self):
- return self
- @Hanzi()
- def __next__(self):
- while True:
- self.a , self.b = self.b, self.a + self.b
- return self.a
复制代码
- if __name__ == '__main__':
- fib = Fib()
- while True:
- print(next(fib))
- input()
复制代码
大于10**28-1就只能显示数字了
|
评分
-
查看全部评分
|