【问题标题】:Django templates: output float with all decimal placesDjango模板:输出所有小数位的浮点数
【发布时间】:2017-04-18 10:37:26
【问题描述】:

我如何在django模板中输出这个数字(小数位数是可变的,我事先不知道):

x = 0.000015

1)

{{x}}

输出是:

1,5e-05

2)

{{x|stringformat:"f"}}

输出是:

0.000015

没有本地化,应该有逗号!我需要将输出本地化并保留所有小数位。

我不敢相信 django 无法使用内置工具处理如此简单的任务。

更新: 我已经有正确的设置:

LANGUAGE_CODE = 'ru'
USE_L10N = True

默认 Django 输出对于大多数浮点数都可以正常工作,它只会在这个小数上失败。它以指数表示法输出,但我需要输出为所有小数位的浮点数(小数位数是可变的)。

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果你知道数字的长度,你可以尝试使用 floatformat 过滤器:

    {{ x|floatformat:6 }}
    

    其中 6 是小数部分的长度。

    【讨论】:

    • 我更新了问题 - 小数位数是可变的,我事先不知道。
    【解决方案2】:

    这是由于区域设置错误造成的。
    Django 本地化工作使用当前的语言环境设置(Format Localization):

    当使用 Django 的格式化系统时,模板上的日期和数字将使用为当前语言环境指定的格式显示。

    要修复它,您应该设置正确的语言环境,我假设它是 pt_BR(由于逗号),但您可以使用任何正确的语言环境。

    尝试将其添加到您的设置中:

    LANGUAGE_CODE = 'pt-BR'
    USE_L10N = True
    

    然后重新运行您的代码

    【讨论】:

    • 我已经有了这些设置(在我的例子中是 LANGUAGE_CODE='ru')。它适用于所有其他浮点数,但仅适用于这个小的浮点数 - 使用我不需要的指数符号输出。
    • 尝试设置为“ru-RU”,这是俄语的有效代码,并通过在命令行上运行import locale; locale.setlocale(locale.LC_ALL, "ru_RU.UTF-8")来验证它是否已安装。
    • 我什至试过 LANGUAGE_CODE = 'pt-BR' 仍然输出为 '1,5e-05'
    • 尝试在模板顶部添加{% load l10n %},然后使用{{x|stringformat:"f"|localize}}
    • 另外,如果你知道 ir 有多少位小数,你也可以试试:{{ x|floatformat:6 }}
    【解决方案3】:

    我找到了另一种解决方案,效果很好。

    首先将 FloatField 转换为 DecimalField:

    some_value = models.DecimalField(max_digits=20, decimal_places=15)
    

    然后在模板中输出如下:

    {{x.some_value.normalize}}
    

    结果它输出 0.000015 为“0.000015”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-17
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      相关资源
      最近更新 更多