You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Jinja模板中将数字转为序数字符串(修复语法错误)

解决Jinja模板中数字转序数字符串的语法错误问题

问题分析

你原来的代码抛出SyntaxError,核心原因是Jinja的表达式解析器不支持Python风格的连续布尔乘法作为切片索引,也无法识别::4这种扩展切片语法。另外,这种紧凑的压缩逻辑不仅可读性差,也不符合Jinja模板的语法规范。

正确实现方式

方式1:模板内显式条件判断(无需修改后端)

这是最直接的兼容写法,可读性强,适用于所有Jinja环境:

{% set num = no_of_owners|int %}
{% set suffix = 'th' %}
{% if num % 10 == 1 and num % 100 != 11 %}
    {% set suffix = 'st' %}
{% elif num % 10 == 2 and num % 100 != 12 %}
    {% set suffix = 'nd' %}
{% elif num % 10 == 3 and num % 100 != 13 %}
    {% set suffix = 'rd' %}
{% endif %}
{{ num }}{{ suffix }}
  • 先将字符串类型的no_of_owners转为整数,避免类型错误
  • 专门处理11/12/13这类特殊情况(它们始终使用th后缀)
  • 显式条件判断完全符合Jinja模板语法,不会触发语法错误

方式2:自定义Jinja过滤器(适合重复使用场景)

如果有权限修改后端代码,可注册自定义过滤器,让模板调用更简洁:
以Flask为例,后端注册过滤器:

@app.template_filter('ordinal')
def ordinal_filter(num_str):
    num = int(num_str)
    suffix = 'th'
    if num % 10 == 1 and num % 100 != 11:
        suffix = 'st'
    elif num % 10 == 2 and num % 100 != 12:
        suffix = 'nd'
    elif num % 10 == 3 and num % 100 != 13:
        suffix = 'rd'
    return f"{num}{suffix}"

模板中直接调用:

{{ no_of_owners|ordinal }}

关键注意事项

  • 必须处理11、12、13的例外:这些数字虽末尾为1/2/3,但序数词后缀固定为th
  • 若存在非数字输入风险,建议添加默认值处理:no_of_owners|int(default=0)

内容的提问来源于stack exchange,提问作者Abinash Biswal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 05:36:27