postgresql 将金额转换为大写函数

由于postgresql不提供patindex函数,所以需要手动创建一个

https://www.nuomiphp.com/a/stackoverflow/zh/62c3f969d362757f41130f06.html

CREATE OR REPLACE FUNCTION "patindex"("pattern" varchar, "expression" varchar)RETURNS "pg_catalog"."int4" AS $BODY$ SELECT COALESCE
(STRPOS($2,(SELECT(REGEXP_MATCHES($2,'(' || REPLACE ( REPLACE ( TRIM ( $1, '%' ), '%', '.*?' ), '_', '.' ) || ')','i' ) ) [ 1 ] LIMIT 1 ) ),0 );
$BODY$LANGUAGE sql IMMUTABLECOST 100

此处为正式函数创建代码

CREATE OR REPLACE FUNCTION "fomat_amount_to_upper"("money" "numeric")RETURNS "pg_catalog"."bpchar" AS $$
DECLARE money_num VARCHAR ( 20 );--存储金额的字符形式
money_chn VARCHAR ( 32 );--存储金额的中文大写形式
n_chn VARCHAR ( 1 );--临时变量
i INT;--临时变量
BEGINmoney_chn :=CASEWHEN money >= 0 THEN'' ELSE NULL END;money := ABS ( money );-- 	to_char格式化前面加fm避免多出的空格money_num := REPLACE ( to_char( money, 'fm000000000000.00' ), '.', '' );--加前置空格补齐到位(去掉小数点)i := patindex ( '%[1-9]%', money_num );--找到金额最高位whilei >= 1 AND i <= 14loopn_chn := SUBSTRING ( money_num, i, 1 ) :: VARCHAR;
--转换阿拉伯数字为中文大写形式IF( n_chn <> '0' OR ( SUBSTRING ( money_num, i + 1, 1 ) <> '0' AND i <= 12 ) ) THENmoney_chn := money_chn || SUBSTRING ( '零壹贰叁肆伍陆柒捌玖', n_chn :: INT + 1, 1 ) :: CHAR;END IF;IFn_chn <> '0' OR i IN ( 4, 8, 12 ) --添加中文单位THENmoney_chn := money_chn || SUBSTRING ( '仟佰拾亿仟佰拾万仟佰拾元角分', i, 1 ) :: CHAR;END IF;i := i + 1;
END loop;
money_chn := REPLACE ( money_chn, '亿万', '亿' );--当金额为x亿零万时去掉万
IFmoney = 0 THENmoney_chn := '零元整';
END IF;--当金额为零时返回'零元整'
IFn_chn = '0' THENmoney_chn := money_chn || '整';--当金额末尾为零分时以'整'结尾
END IF;
RETURN money_chn;--返回大写金额
END$$LANGUAGE plpgsql VOLATILE


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部