我有以下代码,它将作为字符串的输入值与函数约束的输入值进行比较。基本上检查用户输入的数字是否正确。该功能有效,但仅限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根据运行代码的系统获取相应的值。
答案 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
我改变了上面看到的功能,它完美无缺!!您可以查看上面的代码,了解可能需要它的人:)
再次感谢您