首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Python智能地将动态输入转换为固定宽度的输出?

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

Stack Overflow用户
提问于 2012-08-03 13:26:56
回答 3查看 339关注 0票数 2

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

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

代码语言:javascript
复制
input = 123,456,789.4533

该输入数据需要被重新格式化为26位数字的输出,如( 17 )(9)所示,其中前17位是小数点左侧的输入值,左侧填充零,9将是小数点右侧的所有输入值,同样,右侧填充零。因此,如果我们对其进行转换,它将如下所示:

代码语言:javascript
复制
output = 00000000123456789453300000

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

代码语言:javascript
复制
123456789.4533
123.456.789,4533 (european currency)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-03 14:21:28

您可以使用正则表达式来完成此操作

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2012-08-03 14:07:58

代码语言:javascript
复制
>>> 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'
票数 1
EN

Stack Overflow用户

发布于 2012-08-03 14:08:20

如果您绝对确定小数点分隔符将出现,您可以这样做:

代码语言:javascript
复制
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?)

一旦你有了整数部分和小数部分,你就可以按照你需要的方式来填充它们:

代码语言:javascript
复制
output = integer_part.zfill(17) + decimal_part.ljust(9, '0')

解释:

为了找出分隔符是什么,我使用了一个正则表达式来捕获input;

  • Splitting
  1. 中的最后一个非数字字符。使用该分隔符,您可以获得整数和小数部分;删除它们上剩余的任何非数字部分,您只得到数字。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11789767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档