。我正在尝试使用Python实现某些功能,它可以智能地转换输入并应用字符串格式规则以实现可重复输出,如果愿意,可以像智能ETL功能一样。举个例子,我将从地理位置分散的客户端接收数字数据,并且数据需要转换为可重复的格式,以便我们的传统财务引擎可以使用它。
例如,我可能会收到数字数据,例如:
input = 123,456,789.4533
此输入数据需要重新格式化为26位数的输出,如(17)(9)所示,其中前17位是小数点左边的输入值的值,左边是零填充, 9将是小数点右侧的所有输入值,再次在右侧填充零。所以,如果我们要改造它,它看起来像:
output = 00000000123456789453300000
现在,有时输入数据可能如下所示:
123456789.4533
123.456.789,4533 (european currency)
在Python中执行此操作的最佳方法是什么?
答案 0 :(得分:2)
你可以用正则表达式
来做import re
inputs = [r'123,456,789.4533',r'123456789.4533',r'123,456,789,4533',r'123.456.789,4533']
for input in inputs:
decimal = re.search(r'(?<=[.,])\d+$',input).group()
integer = re.search(r'.*(?=[.,]\d+$)',input).group()
checkdigit = lambda x : x.isdigit()
integer = ''.join([character for character in integer if checkdigit(character)])
print integer.rjust(17,'0') + decimal.ljust(9,'0')
<强>打印:强>
00000000123456789453300000
00000000123456789453300000
00000000123456789453300000
答案 1 :(得分:1)
>>> def transfer(input,euro=false):
... part1, _, part2 = input.partition(',' if euro else '.')
... nondigit = lambda x:x.isdigit()
... part1=filter(nondigit, part1)
... part2=filter(nondigit, part2)
... return part1.rjust(17,'0') + part2.ljust(9,'0')
>>> transfer('123456789.4533')
'00000000123456789453300000'
>>> transfer('123.456.789,4533', true)
'00000000123456789453300000'
答案 2 :(得分:1)
如果你完全确定小数点分隔符会出现,你可以这样做:
separator = re.match('.*(\D)\d*$', input).group(1)
integer_part, decimal_part = (re.sub('\D', '', x) for x in input.split(separator))
如果你不是,你必须事先知道分隔符是什么,或者你的问题是不可判定的(123,456
是什么意思?美国符号中的123456e0
或欧洲的123456e-3
一个?)
获得整数部分和小数部分后,您可以按照以下方式填充它们:
output = integer_part.zfill(17) + decimal_part.ljust(9, '0')
说明: