PostgreSQL 中文(漢字)數字轉阿拉伯數字
阿新 • • 發佈:2018-11-12
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