最近做的一个项目,是使用python来编写的,其中有一个需求是客户输入的金钱,是数值类型的,经过处理变成中文形式的,也就是输入123元,要变成一百二十三元,这样经过我们的智能语音机器人的读取,才是人类可读并接受的形式。
首先要知道人类读取金额的习惯:
1、1-9,就直接返回中文的一到九了,或者是繁体的
2、10-19,读成十几返回,不要读成一十几
3、20-99,要读成几十几返回
4、个位数什么都不加,十位数要加十,百位数要加百,千位数要加千
5、四位一组,超过四位要后加‘万’,超过八位后加‘亿’,由于项目中业务原因,只需支持到千亿就行,也就是12位数的金额(怕是没有这么高位的)
6、金额数值中有0或者多个0的,要根据情况来读取,0后面还有大于0的数,就在转换成中文时加‘零’,否则什么都不加,如101读成一百零一,100读成一百
好了,上代码吧:
def num2cn2(number, traditional=False): """ 数字转换成中文(简体和繁体,目前支持到12位数值) :param number: :param traditional: :return: """ if traditional: chinese_num = {0: '零', 1: '壹', 2: '贰', 3: '叁', 4: '肆', 5: '伍', 6: '陆', 7: '柒', 8: '捌', 9: '玖'} chinese_unit = ['仟', '', '拾', '佰'] else: chinese_num = {0: '零', 1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七', 8: '八', 9: '九'} chinese_unit = ['千', '', '十', '百'] extra_unit = ['', '万', '亿'] num_list = list(str(number)) num_cn = [] zero_num = 0 # 连续0的个数 prev_num = '' # 遍历列表中当前元素的前一位 length = len(num_list) for num in num_list: tmp = num if num == '0': # 如果num为0,记录连续0的数量 zero_num = 1 num = '' else: zero = '' if zero_num > 0: zero = '零' zero_num = 0 # 处理前一位数字为0,后一位为1,并且在十位数上的数值读法 if prev_num in ('0', '') and num == '1' and chinese_unit[length % 4] in ('十', '拾'): num = zero chinese_unit[length % 4] else: num = zero chinese_num.get(int(num)) chinese_unit[length % 4] if length % 4 == 1: # 每隔4位加'万'、'亿'拼接 if num == '零': num = extra_unit[length // 4] else: num = extra_unit[length // 4] length -= 1 num_cn.append(num) prev_num = tmp num_cn = ''.join(num_cn) return num_cn
代码中的逻辑,就是按照人类可读的形式来编写的,由于python中的代码编写风格是按照四个空格为一位的缩进,下面的截图可以看的更清楚一些:
在Python Console中来测试一下:
你觉得生活中我们正常读取金钱的读法是什么样呢?
,