我有一些字符串代表具有特定货币格式的数字,例如:
money="$6,150,593.22"
我想将此字符串转换为数字
6150593.22
实现这一目标的最佳方法是什么?
答案 0 :(得分:41)
试试这个:
from re import sub
from decimal import Decimal
money = '$6,150,593.22'
value = Decimal(sub(r'[^\d.]', '', money))
这有一些优势,因为它使用Decimal
而不是float
(这更好地代表货币),并且它还通过不对特定货币符号进行硬编码来避免任何区域设置问题。
答案 1 :(得分:13)
如果你的语言环境设置得当,你可以使用locale.atof
,但你仍然需要手动剥离'$':
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF8')
'en_US.UTF8'
>>> money = "$6,150,593.22"
>>> locale.atof(money.strip("$"))
6150593.2199999997
答案 2 :(得分:5)
展开以在括号中包含负数:
In [1]: import locale, string
In [2]: from decimal import Decimal
In [3]: n = ['$1,234.56','-$1,234.56','($1,234.56)', '$ -1,234.56']
In [4]: tbl = string.maketrans('(','-')
In [5]: %timeit -n10000 [locale.atof( x.translate(tbl, '$)')) for x in n]
10000 loops, best of 3: 31.9 æs per loop
In [6]: %timeit -n10000 [Decimal( x.translate(tbl, '$,)')) for x in n]
10000 loops, best of 3: 21 æs per loop
In [7]: %timeit -n10000 [float( x.replace('(','-').translate(None, '$,)')) for x in n]
10000 loops, best of 3: 3.49 æs per loop
In [8]: %timeit -n10000 [float( x.translate(tbl, '$,)')) for x in n]
10000 loops, best of 3: 2.19 æs per loop
请注意,必须从float()/ Decimal()中删除逗号。替换()或translate()w /转换表可用于转换开头(转换为 - ,转换稍快.flora()最快10-15倍,但缺乏精度并可能出现语言环境问题。十进制( )具有精度,比locale.atof()快50%,但也有区域设置问题.locale.atof()是最慢的,但最常见。
修改:新的str.translate
API(映射到None
的字符从str.translate
函数移至转换表)
In [1]: import locale, string
from decimal import Decimal
locale.setlocale(locale.LC_ALL, '')
n = ['$1,234.56','-$1,234.56','($1,234.56)', '$ -1,234.56']
In [2]: tbl = str.maketrans('(', '-', '$)')
%timeit -n10000 [locale.atof( x.translate(tbl)) for x in n]
18 µs ± 296 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [3]: tbl2 = str.maketrans('(', '-', '$,)')
%timeit -n10000 [Decimal( x.translate(tbl2)) for x in n]
3.77 µs ± 50.8 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [4]: %timeit -n10000 [float( x.translate(tbl2)) for x in n]
3.13 µs ± 66.3 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [5]: tbl3 = str.maketrans('', '', '$,)')
%timeit -n10000 [float( x.replace('(','-').translate(tbl3)) for x in n]
3.51 µs ± 84.8 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
答案 3 :(得分:5)
对于没有硬编码货币位置或符号的解决方案:
raw_price = "17,30 €"
import locale
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF8')
conv = locale.localeconv()
raw_numbers = raw_price.strip(conv['currency_symbol'].decode('utf-8'))
amount = locale.atof(raw_numbers)
答案 4 :(得分:2)
我发现babel
package对于解决该问题非常有用
使用本地化表示法可以轻松解析数字:
>>> babel.numbers.parse_decimal('1,024.64', locale='en')
Decimal('1024.64')
>>> babel.numbers.parse_decimal('1.024,64', locale='de')
Decimal('1024.64')
>>>
您可以使用babel.numbers.get_currency_symbol('USD')
去除前缀/后缀,而无需对其进行硬编码。
Hth, dtk
答案 5 :(得分:1)
几年前我做了这个功能来解决同样的问题。
def money(number):
number = number.strip('$')
try:
[num,dec]=number.rsplit('.')
dec = int(dec)
aside = str(dec)
x = int('1'+'0'*len(aside))
price = float(dec)/x
num = num.replace(',','')
num = int(num)
price = num + price
except:
price = int(number)
return price
答案 6 :(得分:0)
此功能已将土耳其价格格式转换为十进制数字。
money = '1.234,75'
def make_decimal(string):
result = 0
if string:
[num, dec] = string.rsplit(',')
result += int(num.replace('.', ''))
result += (int(dec) / 100)
return result
print(make_decimal(money))
1234.75
答案 7 :(得分:0)
我找到的最简单的方法,无需在对货币检测造成混乱的情况下进行硬编码:
>>> money="$6,150,593.22"
>>> amount = float("".join(d for d in money if d.isdigit()))
>>> amount
615059322.0
credit: https://www.reddit.com/r/learnpython/comments/2248mp/how_to_format_currency_without_currency_sign/cgjd1o4?utm_source=share&utm_medium=web2x