1. 程式人生 > >PostgreSQL 中文(漢字)數字轉阿拉伯數字

PostgreSQL 中文(漢字)數字轉阿拉伯數字

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 
[email protected]
> 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