python中有3位小数的货币

时间:2015-08-11 19:57:14

标签: python locale currency

我有以下代码,它将作为字符串的输入值与函数约束的输入值进行比较。基本上检查用户输入的数字是否正确。该功能有效,但仅限2个小数点,但允许用户输入2到4个十进制数字......如何构造正确的值?

def check_currency(self, amount):
        amount = amount.replace("+", "")
        amount = amount.replace("-", "")
        sInput = amount.replace(",", ".")
        locale.setlocale(locale.LC_ALL, self.LANG)
        result = locale.currency(float(sInput), symbol=False, grouping=True)
        if (amount == result):
            return True
        else:
            return False

PS:self.LANG根据运行代码的系统获取相应的值。

2 个答案:

答案 0 :(得分:3)

你不会错过任何东西。 locale.currency根据locale.localeconv()返回的字典中的值以及它应该执行的操作来格式化数字。当然,'frac_digits'通常是2,因为......嗯......你知道。

关于该怎么做:

首先,您可以在'int_frac_digits'中查看localeconv() - 也许它对您来说足够好。

如果没有,因为locale.currency位于Python源模块中,你可以装备...我的意思是,覆盖它的逻辑。查看源代码,最简单的方法似乎是用包装器替换locale.localeconv()

要小心,因为这样的改变将是全球性的。如果您不希望它使用locale影响其他代码,请更改实体的本地副本(or the entire module)或更改实体,例如需要一个额外的参数来表现不同。

概念性说明: locale实际上是正确的 - 出于其目的 - 不允许更改表示。它的任务是根据当地惯例格式化几种类型的信息 - 因此,无论您使用何种文化,他们都会以他们习惯的方式看到信息。如果你以任何方式改变格式 - 不再是"本地约定"!事实上,通过要求3位小数,你是已经对当地公约做出了假设 - 这可能不会成立。例如在相当多的货币中,即使很小的数额也可以数以千计。

答案 1 :(得分:0)

def check_currency(self, amount):
        amount = amount.replace("+", "")
        amount = amount.replace("-", "")
        sInput = amount.replace(",", ".")
        length = len(amount)
        decimals = len(sInput[sInput.find(".")+1:])
        locale.setlocale(locale.LC_ALL, self.LANG)
        if not sInput:
            return  "Empty Value"   
        if decimals<=2:
                digit = decimals
                result = locale.format('%%.%if' % digit, abs(Decimal(sInput)), grouping=True, monetary=True)
        if decimals>2:
                sInput = amount.replace(".", "")
                digit = 0
                result = locale.format('%%.%if' % digit, abs(Decimal(sInput)), grouping=True, monetary=True)
        if (amount == result):
            return True
        else:
            return False

我改变了上面看到的功能,它完美无缺!!您可以查看上面的代码,了解可能需要它的人:)

再次感谢您