2

。Pythonを使用して、入力をインテリジェントに変換し、繰り返し可能な出力に文字列形式のルールを適用できるようにしようとしています。これは、スマートETL関数のようなものです。その好例として、地理的に分散したクライアントから数値データを受け取ります。そのデータは、従来の金融エンジンで使用できるように、繰り返し可能な形式に変換する必要があります。

たとえば、次のような数値データを受け取る場合があります。

input = 123,456,789.4533

この入力データは、(17)(9)として示される26桁の出力に再フォーマットする必要があります。ここで、最初の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どういう意味ですか?)123456e0123456e-3

整数部分と小数部分ができたら、必要な方法でそれらを埋めることができます。

output = integer_part.zfill(17) + decimal_part.ljust(9, '0')

説明:

  1. 区切り文字を見つけるために、正規表現を使用して、入力の最後の数字以外の文字をキャプチャしました。
  2. そのセパレータを使用して文字列を分割すると、整数部分と小数部分が得られます。それらに残っている数字以外を削除すると、数字のみが表示されます。
于 2012-08-03T06:08:20.493 に答える