PostgreSQL 中文(简体、繁体)数字转阿拉伯数字
函数代码
--中文汉字转阿拉伯数字
CREATE OR REPLACE FUNCTION udf_hanzi2digits(input_chinese text)
RETURNS bigint
LANGUAGE plpgsql
AS $function$
DECLARE
val INT8 :=0;--结果
tmp INT8 :=0; -- 临时值
num_unit INTEGER :=0;--数字单位
ldig INTEGER[] ; --数值数组
cndig TEXT ; --汉字字符
dig INTEGER :=0; --个位数
x INTEGER :=0;
v_index INTEGER :=0; --数组的下标
chinese TEXT[] := ARRAY['零','一','二','三','四','五','六','七','八','九','十','百','千','万','亿','两','壹','贰','叁','肆','伍','陆','柒','捌','玖','貮','拾','佰','仟','萬','億','〇'];
digit INTEGER[] :=ARRAY[0,1,2,3,4,5,6,7,8,9,10,100,1000,10000,100000000,2,1,2,3,4,5,6,7,8,9,2,10,100,1000,10000,100000000,0];
number_type TEXT[] := ARRAY['num','num','num','num','num','num','num','num','num','num','unit','unit','unit','unit','unit','num','num','num','num','num','num','num','num','num','num','num','unit','unit','unit','unit','unit','num'];
BEGIN
IF chinese@> regexp_split_to_array(input_chinese,'')=false then
raise notice '%','参数不全是中文数字!';
RETURN NULL;
END IF;
foreach cndig in ARRAY regexp_split_to_array(reverse(input_chinese), '') LOOP
v_index := array_position(chinese, cndig);
IF (number_type[v_index]) = 'unit' THEN
num_unit := (digit[v_index]);
IF num_unit = 10000 OR num_unit = 100000000 THEN
ldig := array_prepend(num_unit,ldig);
num_unit := 1;
END IF;
ELSE
dig := (digit[v_index]);
IF num_unit > 0 THEN
dig := dig * num_unit;
num_unit := 0;
END IF;
ldig := array_prepend(dig,ldig);
END IF;
END LOOP;
IF num_unit = 10 THEN
ldig := array_prepend(10,ldig);
END IF;
foreach x IN ARRAY ldig LOOP
IF (x = 10000 OR x = 100000000) THEN
val := val + (tmp*x);
tmp := 0 ;
ELSE
tmp := tmp + x ;
END IF;
END LOOP;
val := val + tmp;
RETURN val;
END;
$function$;
测试
--1. 小写汉字数字转阿拉伯数字
select udf_hanzi2digits('一百八十万零八十');
--1800080
--2. 大写汉字数字转阿拉伯数字
select udf_hanzi2digits('壹佰捌拾贰');
--182
--3. 混合汉字转换
select udf_hanzi2digits('一百八十万零壹佰捌拾贰');
--1800182