Reputation: 522
I have a number of strings that represent numbers which use commas or points to separate thousands and have different floating separators. For example:
"22 000,76", "22.000,76", "22,000.76", "1022000,76", "-1,022,000.76", "1022000", "22 000,76$", "$22 000,76"
How can I convert these to float point numbers in Python?
In PHP I use function like this: http://docs.php.net/manual/sr/function.floatval.php#84793
Upvotes: 3
Views: 1581
Reputation: 919
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)
Upvotes: 5
Reputation: 29302
Supposing you have at most 2 decimal digits:
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(',', '.'))
I test it on your example:
>>> for n in nums:
... print(convert(n))
...
22000.76
22000.76
22000.76
1022000.76
-1022000.76
1022000.0
22000.76
22000.76
Upvotes: 0