我正在尝试用Python实现一些东西,它可以智能地转换输入,并将字符串格式规则应用于可重复输出,有点像智能ETL函数,如果你愿意的话。举个例子,我将从地理上分散的客户那里接收数字数据,这些数据需要转换为可重复的格式,以便我们的传统金融引擎可以使用这些数据。
例如,我可能会收到以下数字数据:
input = 123,456,789.4533该输入数据需要被重新格式化为26位数字的输出,如( 17 )(9)所示,其中前17位是小数点左侧的输入值,左侧填充零,9将是小数点右侧的所有输入值,同样,右侧填充零。因此,如果我们对其进行转换,它将如下所示:
output = 00000000123456789453300000现在,有时输入数据可能如下所示:
123456789.4533
123.456.789,4533 (european currency)在Python中执行此操作的最佳方式是什么?
发布于 2012-08-03 14:21:28
您可以使用正则表达式来完成此操作
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
发布于 2012-08-03 14:07:58
>>> 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'发布于 2012-08-03 14:08:20
如果您绝对确定小数点分隔符将出现,您可以这样做:
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')解释:
为了找出分隔符是什么,我使用了一个正则表达式来捕获input;
https://stackoverflow.com/questions/11789767
复制相似问题