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
我改变了你在上面看到的功能,它完美无缺!!您可以检查上面的代码以供可能需要的人使用:)
再次感谢
我有以下代码,它将作为字符串出现的输入值与函数构造的输入值进行比较。基本上检查用户输入的数字是否正确。该函数有效,但仅适用于 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
我改变了你在上面看到的功能,它完美无缺!!您可以检查上面的代码以供可能需要的人使用:)
再次感谢