如何让Python智能地将动态输入转换为固定宽度输出?

时间:2012-08-03 05:26:56

标签: python string function format etl

。我正在尝试使用Python实现某些功能,它可以智能地转换输入并应用字符串格式规则以实现可重复输出,如果愿意,可以像智能ETL功能一样。举个例子,我将从地理位置分散的客户端接收数字数据,并且数据需要转换为可重复的格式,以便我们的传统财务引擎可以使用它。

例如,我可能会收到数字数据,例如:

input = 123,456,789.4533

此输入数据需要重新格式化为26位数的输出,如(17)(9)所示,其中前17位是小数点左边的输入值的值,左边是零填充, 9将是小数点右侧的所有输入值,再次在右侧填充零。所以,如果我们要改造它,它看起来像:

output = 00000000123456789453300000

现在,有时输入数据可能如下所示:

123456789.4533
123.456.789,4533 (european currency)

在Python中执行此操作的最佳方法是什么?

3 个答案:

答案 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')

说明:

  1. 要查找分隔符是什么,我使用正则表达式捕获输入中的最后一位非数字字符;
  2. 使用该分隔符拆分字符串,可以得到整数和小数部分;删除任何剩余的非数字,只能获得数字。