Postgres如何使用cash_words函数实现印度货币格式的数字转文字
解决方案
前置校验
- 首先确认操作系统已安装
en_IN.UTF-8locale,执行系统命令locale -a | grep en_IN验证,无输出的话需要先生成对应语言包再调整数据库配置。
1. 修正cash_words的参数传入逻辑与lc_monetary生效范围
cash_words直接传入字符串/数值时会触发默认的美元格式化逻辑,不会读取lc_monetary配置,需先将输入值显式转换为money类型:
-- 会话级临时生效货币区域配置 SET lc_monetary = 'en_IN.UTF-8'; -- 正确调用方式 SELECT cash_words('100'::money);
此时输出结果会变为one hundred rupees and zero cents。
如果需要永久生效lc_monetary配置,可选择以下任意一种方式:
- 修改
postgresql.conf配置文件,添加lc_monetary = 'en_IN.UTF-8',修改后执行SELECT pg_reload_conf();重载配置实现全局生效 - 仅针对当前数据库生效:
ALTER DATABASE 你的数据库名称 SET lc_monetary = 'en_IN.UTF-8'; - 仅针对指定用户生效:
ALTER ROLE 你的用户名 SET lc_monetary = 'en_IN.UTF-8';
2. 去除零分后缀
PostgreSQL 12及以上版本支持cash_words_show_cents参数控制是否输出分的部分:
- 会话级临时生效:
SET cash_words_show_cents = off;,设置后调用cash_words('100'::money)会直接输出one hundred rupees - 永久生效方式同上述
lc_monetary的配置逻辑,将参数名替换为cash_words_show_cents即可。
3. 低版本兼容方案
如果使用PostgreSQL 12以下不支持cash_words_show_cents的版本,可通过字符串替换直接处理输出结果:
SELECT regexp_replace(cash_words('100'::money), ' and zero cents$', '');
内容的提问来源于stack exchange,提问作者newdis
相关产品推荐
相关产品推荐

