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 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

猜你喜欢

转载自blog.csdn.net/zhanghao519/article/details/82495404