赞
踩
最近获取到了如下类型的数据:
11万1千,3万1,1万5百,为了方便运算需要将数据转换位纯数字形式。也就是说需要转换数字加中文的字符串为纯数字形式,以便更好的使用。
运用正则表达式,提取出字符串中的数字加文字,分别存在两个个数组a和b,以下面两种情况加以讨论
1.1万1千 可以转换为a => [11,1],b => [“万”,“千”],此时可以看出数字和单位是一一对应的,直接“相乘”就行
2.3万1 可以转换为a => [3,1], b => [“万”],此时a中1的单位应该是千,也就应该是0.1万。
于是有了如下代码:
import re use_index = {'万': 10000, '千': 1000, '百': 100, '十': 10} def get_price0(s): nums = re.findall("\d+",s) danwei = re.findall("\d+(\w)",s) numlen = len(nums) danweilen = len(danwei) price = 0 for i in range(numlen - 1): price +=use_index[danwei[i]] * int(nums[i]) # 只需要判断位数是否相等,相等就直接乘,不相等就乘上一位单位 if numlen == danweilen: price += use_index[danwei[-1]] * int(nums[-1]) else: price += use_index[danwei[-1]] * int(nums[-1]) / 10 return int(price) if __name__ == '__main__': s = ["11万1千","3万1","1万5百"] for ss in s: price = get_price0(ss) print(price)
有鉴于思路一的方法,可以考虑一个片段abc,abc为三个字符,现考虑b,如果b为数字,那么就要考虑b的前一位是否为数字,b的后一位是否为单位。考虑了这两点就可以解决问题了。
use_index = {'万': 10000, '千': 1000, '百': 100, '十': 10} def get_price(s): s = " " + s + " " price = 0 fg = 0 for i in range(1, len(s) - 1): c = s[i] if c.isdigit(): fg = 10 * fg + int(c) if not s[i + 1].isdigit(): price = price + fg * use_index[s[i + 1]] if s[i + 1] != " " else price + fg * use_index[s[i - 1]] / 10 fg = 0 return price if __name__ == '__main__': s = ["11万1千","3万1","1万5百"] for ss in s: price = get_price(ss) print(price)
当原始问题中数字变为中文数字时,就需要进一步的转换了,将中文转换为数字,另外当出现2百5十万3千8百这样的情况时,思路一也就不是很好处理了,思路二的话,可以在加一种中间位和前一位都为汉字的情况进行讨论了。由于目前暂时不会涉及到,就只留下了解决思路。
另外对于发票的转换,可以直接使用Excel中的扩展函数zhmoneytonum(将中文大写金额转为数字金额)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。