如何禁用Django模板中的小数点分隔符显示?
解决Django部署后数字出现千位分隔符的问题
这问题我之前帮好几个开发者排查过,大概率是本地化(locale)配置差异搞的鬼——本地开发环境和服务器的数字格式化规则不一样,导致显示效果出现区别。而且你用的intcoma过滤器本来是用来添加千位分隔符的,用它来去除当然没效果啦😂
下面是几个靠谱的解决办法,按优先级来:
1. 用stringformat过滤器强制格式化整数
这是最简单的快速解决方案,直接在模板里把数字强制转成无分隔符的整数格式:
{{ your_number_variable|stringformat:"d" }}
"d"表示十进制整数格式,不管当前locale怎么设置,都会输出纯数字无分隔符的样式。如果你的数字是浮点数,想转成整数再输出,可以先加floatformat:"0"再用stringformat:
{{ your_float_number|floatformat:"0"|stringformat:"d" }}
2. 调整Django的本地化配置
如果整个项目都不需要数字自动添加分隔符,可以修改settings.py里的本地化相关设置:
- 把
USE_L10N = True改成USE_L10N = False:这样Django就不会自动根据语言设置格式化数字、日期等内容了。 - 或者更精准地配置数字格式:保持
USE_L10N = True,但自定义数字格式。在项目根目录创建locale/<你的语言代码>/LC_NUMERIC文件(比如locale/en/LC_NUMERIC),里面定义无分隔符的格式:
千位分隔符 "" 小数点 "."
然后运行django-admin compilemessages编译本地化文件,重启服务器。
3. 自定义一个去除分隔符的过滤器
如果上面的方法都不适用,自己写个简单的过滤器最稳妥:
- 在你的app里创建
templatetags文件夹(记得加__init__.py),新建custom_filters.py:
from django import template register = template.Library() @register.filter def remove_separator(value): try: # 先转成整数,再转成字符串,自动去掉所有分隔符 return str(int(value)) except (ValueError, TypeError): # 处理非数字的情况,返回原内容 return value
- 在模板里加载并使用:
{% load custom_filters %} {{ your_number|remove_separator }}
4. 检查服务器的系统locale设置
有时候Django会继承服务器的系统locale配置,比如服务器的LC_NUMERIC设置的是带千位分隔符的规则。可以在服务器上运行locale命令查看当前设置,如果需要的话,修改服务器的locale(比如设置LC_NUMERIC=C),或者在Django的wsgi.py里手动设置:
import locale locale.setlocale(locale.LC_NUMERIC, 'C')
内容的提问来源于stack exchange,提问作者Cesar Leonardo Ochoa Contreras
相关产品推荐
相关产品推荐

