【发布时间】:2016-06-01 23:02:43
【问题描述】:
我刚刚从Format numbers as currency in Python 了解到,Python 模块babel 提供babel.numbers.format_currency 将数字格式化为货币。例如,
from babel.numbers import format_currency
s = format_currency(123456.789, 'USD', locale='en_US') # u'$123,456.79'
s = format_currency(123456.789, 'EUR', locale='fr_FR') # u'123\xa0456,79\xa0\u20ac'
反过来呢,从货币到数字,比如$123,456,789.00 --> 123456789? babel 提供了babel.numbers.parse_number 来解析本地号码,但是我没有找到类似parse_currency 的东西。那么,将本地货币解析为数字的理想方法是什么?
我通过Python: removing characters except digits from string。
# Way 1
import string
all=string.maketrans('','')
nodigs=all.translate(all, string.digits)
s = '$123,456.79'
n = s.translate(all, nodigs) # 12345679, lost `.`
# Way 2
import re
n = re.sub("\D", "", s) # 12345679
它不关心小数点分隔符.。
从字符串中删除所有非数字字符,. 除外(请参阅here),
import re
# Way 1:
s = '$123,456.79'
n = re.sub("[^0-9|.]", "", s) # 123456.79
# Way 2:
non_decimal = re.compile(r'[^\d.]+')
s = '$123,456.79'
n = non_decimal.sub('', s) # 123456.79
它确实处理小数分隔符.。
但上述解决方案在遇到时不起作用,例如,
from babel.numbers import format_currency
s = format_currency(123456.789, 'EUR', locale='fr_FR') # u'123\xa0456,79\xa0\u20ac'
new_s = s.encode('utf-8') # 123 456,79 €
如您所见,货币的格式各不相同。 以一般方式将货币解析为数字的理想方法是什么?
【问题讨论】:
-
你为什么会无缘无故被否决?
-
@leekaiinthesky,货币可能包含
,或.。 -
@TigerhawkT3 不完全重复,因为
.仍然有意义。 -
@sparkandshine 你也想输入语言环境吗?或者你会知道要取出哪些字符(在这种情况下正则表达式就足够了)?
-
这绝对不是重复的,从货币到十进制数字要复杂得多。
标签: python numbers currency-formatting