2

.我正在尝试使用 Python 实现一些功能,它可以智能地转换输入并为可重复输出应用字符串格式规则,如果你愿意的话,有点像智能 ETL 函数。举个例子,我将收到来自地理位置分散的客户的数字数据,这些数据需要转换为可重复的格式,以便我们的传统金融引擎可以使用它。

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

input = 123,456,789.4533

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

output = 00000000123456789453300000

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

123456789.4533
123.456.789,4533 (european currency)

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

4

3 回答 3

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

于 2012-08-03T06:21:28.367 回答
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'
于 2012-08-03T06:07:57.853 回答
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. 使用该分隔符拆分字符串,得到整数和小数部分;删除它们上任何剩余的非数字,你只会得到数字。
于 2012-08-03T06:08:20.493 回答