python 中 3 位小数的货币

Currency with 3 decimal digits in python

我有以下代码,它将作为字符串出现的输入值与函数构造的输入值进行比较。基本上检查用户输入的数字是否正确。该函数有效,但仅适用于 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根据代码运行的系统获取相应的值。

你没有遗漏任何东西。 locale.currency 根据 locale.localeconv() 返回的字典中的值格式化数字,这就是它应该做的。自然地,'frac_digits' 通常是 2,因为......好吧......你知道。


关于做什么:

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

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

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


关于概念性说明: locale 实际上是正确的 - 就其目的而言 - 不允许更改表示。它的任务是根据当地惯例对几种类型的信息进行格式化——因此无论您的用户属于何种文化,他们都会以他们习惯的方式查看信息。如果您以任何方式更改格式 - 那将不再是 "the local convention"! 事实上,通过要求 3 个十进制数字,您已经关于当地惯例的假设 - 这可能不成立。 例如在相当大的货币份额中,即使是小额金额也可以达到数千。

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

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

再次感谢