python - 以印度/美国表示法转换数字以值的变化结束

标签 python python-3.x

我试图用印度/美国表示法表示数字,但我给出的值和输出不一样。请检查代码。

import locale
result = 1
for i in range(1,65):
    result = result*i
print (result)

output: 126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000

print(f'{result:,}')

output: 126,886,932,185,884,164,103,433,389,335,161,480,802,865,516,174,545,192,198,801,894,375,214,704,230,400,000,000,000,000

locale.setlocale(locale.LC_MONETARY, 'en_IN')
print(locale.currency(result, grouping=True))

output:₹1,26,88,69,32,18,58,84,16,54,37,80,68,97,58,51,22,92,52,90,11,90,29,06,47,05,20,97,78,50,85,45,10,34,77,59,05,11,63,70,67,40,17,89,440.00

locale.setlocale(locale.LC_MONETARY, 'en_US')
print(locale.currency(result, grouping=True))

output:$126,886,932,185,884,165,437,806,897,585,122,925,290,119,029,064,705,209,778,508,545,103,477,590,511,637,067,401,789,440.00

如果您注意到 print(f'{result:,}') 结果的值没有改变,但问题出在区域设置包上,其中结果和输出从 更改12688693218588416

问题:

1.为什么值会变化?

2.如何纠正这个问题?

最佳答案

看起来 locale.currency() 正在将您的输入转换为 float 。我不知道如何解决这个问题,但您可以使用以下替代方案:

import locale

def big_money(val, loc):
    locale.setlocale(locale.LC_MONETARY, loc)
    retval = locale.localeconv()["currency_symbol"] + locale.format_string("%i", val, grouping=True, monetary=True)
    locale.setlocale(locale.LC_MONETARY, "")
    return retval

result = 126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000

print(big_money(result, "en_IN"))
print(big_money(result, "en_US"))

这给了我:

?1,26,88,69,32,18,58,84,16,41,03,43,33,89,33,51,61,48,08,02,86,55,16,17,45,45,19,21,98,80,18,94,37,52,14,70,42,30,40,00,00,00,00,00,000
$126,886,932,185,884,164,103,433,389,335,161,480,802,865,516,174,545,192,198,801,894,375,214,704,230,400,000,000,000,000

实际上反射(reflection)一下,我认为这个方法根本不应该与本地混淆,所以使用:

import locale

def big_money(val):
    return locale.localeconv()["currency_symbol"] + locale.format_string("%i", val, grouping=True, monetary=True)

result = 126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000

locale.setlocale(locale.LC_MONETARY, "en_IN")
print(big_money(result))

locale.setlocale(locale.LC_MONETARY, "en_US")
print(big_money(result))

最终你仍然得到:

?1,26,88,69,32,18,58,84,16,41,03,43,33,89,33,51,61,48,08,02,86,55,16,17,45,45,19,21,98,80,18,94,37,52,14,70,42,30,40,00,00,00,00,00,000
$126,886,932,185,884,164,103,433,389,335,161,480,802,865,516,174,545,192,198,801,894,375,214,704,230,400,000,000,000,000

关于python - 以印度/美国表示法转换数字以值的变化结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67520737/

相关文章:

Python 脚本未创建足够的输出行

visual-studio - Intellisense 无法识别 Python 3 的类型提示

Python 字符串中的字符匹配

python - 如何将文件结构表示为 python 对象

python - 如何在 pandas python 中创建 DataFrame

python - 如何使用 Python 进行用户身份验证 Azure DevOps

python - 如何路由到特定的 View 集方法 Django

python - 如何为字母和字母数字密码创建暴力密码破解程序?

mysql - Python - MySql.Connector UPDATE 语句不起作用

python - 使用 wexpect 运行可执行文件