2012-02-10 147 views
2

我有一些字符串代表使用逗號或點來分隔數以及具有不同浮動分隔符的數字。例如:解析一個字符串以漂浮不同的分隔符

「22 000,76」, 「22.000,76」, 「22,000.76」, 「1022000,76」, 「-1,022,000.76」, 「1022000」, 「22個000,76 $」,「 $ 22 000,76「

如何將這些轉換爲Python中的浮點數?

在PHP我用的功能是這樣的:http://docs.php.net/manual/sr/function.floatval.php#84793

+0

燦你向我們展示你需要的輸出。我對你的例子有點困惑。 – RanRag 2012-02-10 12:14:34

+0

輸出示例:22000.76,22000.76,22000.76,1022000.76,1022000.76,1022000,22000.76,22000.76 - 浮點數 – mikhail 2012-02-10 12:22:21

+0

@Bondarenko:那麼「100,000」呢? – 2012-02-10 12:30:34

回答

4
import re 
import locale 

# Remove anything not a digit, comma or period 
no_cruft = re.sub(r'[^\d,.-]', '', st) 

# Split the result into parts consisting purely of digits 
parts = re.split(r'[,.]', no_cruft) 

# ...and sew them back together 
if len(parts) == 1: 
    # No delimeters found 
    float_str = parts[0] 
elif len(parts[-1]) != 2: 
    # >= 1 delimeters found. If the length of last part is not equal to 2, assume it is not a decimal part 
    float_str = ''.join(parts) 
else: 
    float_str = '%s%s%s' % (''.join(parts[0:-1]), 
          locale.localeconv()['decimal_point'], 
          parts[-1]) 

# Convert to float 
my_float = float(float_str) 
+0

請勿使用我的回答是,如果@Niklas B建議的「100,000」應該是100000. – westmark 2012-02-10 12:34:56

+0

使用locale.localeconv()['decimal_point']'確保'float'不會失敗當前語言環境中的小數點不是「。」。 – jcollado 2012-02-10 12:39:19

+0

好點@jcollado。編輯我的答案。 – westmark 2012-02-10 12:42:39

0

假如你有最多2個十進制數字:

sign_trans = str.maketrans({'$': '', ' ':''}) 
dot_trans = str.maketrans({'.': '', ',': ''}) 

def convert(num, sign_trans=sign_trans, dot_trans=dot_trans): 
    num = num.translate(sign_trans) 
    num = num[:-3].translate(dot_trans) + num[-3:] 
    return float(num.replace(',', '.')) 

我測試它在你的例子:

>>> for n in nums: 
...  print(convert(n)) 
... 
22000.76 
22000.76 
22000.76 
1022000.76 
-1022000.76 
1022000.0 
22000.76 
22000.76