【问题标题】:Jinja Templates - Format a float as comma-separated currencyJinja 模板 - 将浮点数格式化为逗号分隔的货币
【发布时间】:2012-08-18 04:45:20
【问题描述】:

我正在尝试将浮点数格式化为逗号分隔的货币。例如。 543921.9354 变为 $543,921.94。我在 Jinja 模板中使用 format 过滤器,它似乎模仿 Python 中的 % 运算符而不是 Python 中的 format 函数?

如何在 Jinja 中完成这种格式化?是否可以使用format 过滤器?这是我到目前为止所拥有的,它完成了除逗号之外的所有内容:

"$%.2f"|format(543921.9354)

当然会产生

$543921.94

【问题讨论】:

    标签: python flask jinja2


    【解决方案1】:

    更新:使用 Jinja2 和 Python 3,这在模板中运行良好,无需定义任何自定义代码:

    {{ "${:,.2f}".format(543921.9354) }}
    

    我不确定这项工作的确切依赖项是什么,但恕我直言,其他阅读此答案的人最好至少在担心自定义过滤器之前尝试一下。

    【讨论】:

    • 这在 Python 2.7 上也适用于我。很好的答案!
    • 知道如何隐藏圆形部分并只显示小数吗?
    • 效果很好!!一个缺点是负数的符号在 $ 之后。例如:-1000.50 = $-1,000.50。我可以通过使用 babel 编写自定义过滤器来解决这个问题
    • 好点 Ravishankar。我不再有 Jinja2 触手可及了,但我想知道这样的事情是否可行? {{ n >= 0 ? "${:,.2f}".format(n) : "-${:,.2f}".format(abs(n)) }} 让我们知道你是否可以试试。 :)
    【解决方案2】:

    为此写一个custom filter。如果您使用的是 python 2.7,它可能如下所示:

    def format_currency(value):
        return "${:,.2f}".format(value)
    

    【讨论】:

      【解决方案3】:

      Python3.6:

      def numberFormat(value):
          return format(int(value), ',d')
      

      Flask 全局过滤器

      @app.template_filter()
      def numberFormat(value):
          return format(int(value), ',d')
      

      蓝图的 Flask 全局过滤器

      @app.app_template_filter()
      def numberFormat(value):
          return format(int(value), ',d')
      

      调用这个全局过滤器

      {{ '1234567' | numberFormat }}
      #prints 1,234,567
      

      在 Jinja 中调用它而不分配全局过滤器

      {{ format('1234567', ',d') }}
      #prints 1,234,567
      

      【讨论】:

        【解决方案4】:

        为了扩展@alex vasi 的答案,我肯定会编写一个自定义过滤器,但我也会使用python 自己的locale 功能,它处理货币分组和符号,

        def format_currency(value):
            return locale.currency(value, symbol=True, grouping=True)
        

        使用locale 的主要注意事项是它不适用于默认的“C”语言环境,因此您必须对其进行设置,以便在您的机器上可用。

        对于您正在寻找的,您可能需要,

        locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
        

        但如果你想要英镑,你会使用,

        locale.setlocale(locale.LC_ALL, 'en_GB.UTF_8')
        

        .

        import locale
        locale.setlocale(locale.LC_ALL, 'en_US')
        locale.currency(543921.94, symbol=True, grouping=True)
        > '$543,921.94'
        locale.setlocale(locale.LC_ALL, 'en_GB')
        > '£543,921.94'
        

        【讨论】:

          【解决方案5】:

          如果您有 Python 2.6 或更高版本:

          您可以为一个目的编写自定义过滤器,但作为更广泛的解决方案,您也可以更新格式过滤器本身:

          from jinja import Environment, FileSystemLoader
          
          def format(fmt_str, *args, **kwargs):
              if args and kwargs:
                  raise jinja2.exceptions.FilterArgumentError(
                      "can't handle positional and keyword "
                      "arguments at the same time"
                  )
              ufmt_str = jinja2.utils.soft_unicode(fmt_str)
              if kwargs:
                  return ufmt_str.format(**kwargs)
              return ufmt_str.format(*args)
          
          
          env = Environment(loader=FileSystemLoader('./my/template/dir'))
          env.filters.update({
              'format': format,
          })
          

          这将替换现有的format 过滤器(从 Jinja 2.7.1 开始)。大部分功能直接来自format 源。这个函数和 jinja 的唯一区别是它使用str.format() 函数来格式化字符串。

          看到 Jinja2(在撰写本文时)不再支持 Python 2.5,我敢打赌 format 过滤器使用 Python 的 str.format() 不久。

          【讨论】:

            【解决方案6】:

            使用 Babel 的自定义过滤器(也可用于格式化其他货币)

            安装 Babel (http://babel.pocoo.org/en/latest/api/numbers.html)

            pip install Babel
            

            自定义 Jinja 过滤器

            from babel.numbers import format_currency
            
            @app.template_filter()
            def usdollar(value):
               return format_currency(value, 'USD', locale='en_US')
            
            app.jinja_env.filters['usdollar'] = usdollar
            

            在 Jinja 模板中的用法:

            {{ '-10000.500' | usdollar }}
            
            Output : -$10,000.50
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-04-21
              • 1970-01-01
              • 1970-01-01
              • 2014-08-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多