oracle中文數字轉阿拉伯數字

CREATE OR REPLACE FUNCTION chi2num(chivalue IN VARCHAR2) RETURN NUMBER IS

  TYPE MAP IS TABLE OF BINARY_INTEGER INDEX BY VARCHAR2(10);
  ling_jiu_map   MAP;
  shibaiqian_map MAP;
  wanyizhao_map  MAP;
  --臨時變量
  i            INT := 0; --'臨時變量
  k            INT := 0; --臨時變量
  x            INT := 0; --臨時變量
  str          VARCHAR2(100) := ''; --臨時變量
  tmp          INT := 0; --臨時變量
  tmp2         INT := 0; --臨時變量
  integer_part VARCHAR2(100) := ''; --數字形式整數部分
  float_part   VARCHAR2(100) := ''; --數字形式小數部分
  returnvalue  NUMBER := 0; --返回值
BEGIN
  --初始化數組
  ling_jiu_map('零') := 0;
  ling_jiu_map('一') := 1;
  ling_jiu_map('二') := 2;
  ling_jiu_map('三') := 3;
  ling_jiu_map('四') := 4;
  ling_jiu_map('五') := 5;
  ling_jiu_map('六') := 6;
  ling_jiu_map('七') := 7;
  ling_jiu_map('八') := 8;
  ling_jiu_map('九') := 9;
  shibaiqian_map('') := 0;
  shibaiqian_map('十') := 1;
  shibaiqian_map('百') := 2;
  shibaiqian_map('千') := 3;
  wanyizhao_map('') := 0;
  wanyizhao_map('萬') := 1;
  wanyizhao_map('億') := 2;
  wanyizhao_map('兆') := 3;

  str := REGEXP_REPLACE(chivalue, '^十', '一十');
  str := REGEXP_REPLACE(str, '零十', '零一十');
  --將數字拆分爲整數與浮點數兩個數字數組
  i := INSTR(str, '點', 1);

  IF i = 0 THEN
    integer_part := SUBSTR(str, 1);
  ELSE
    integer_part := SUBSTR(str, 1, i - 1);
    float_part   := SUBSTR(str, i + 1);
  END IF;

  --整型部分
  x    := LENGTH(integer_part);
  str  := '';
  tmp  := 0;
  tmp2 := 0;

  FOR k IN 1 .. x LOOP
    str := SUBSTR(integer_part, k, 1);
 
    IF str IN ('萬', '億', '兆') THEN
      --當碰到萬億兆時
      tmp         := tmp + tmp2;
      returnvalue := returnvalue + tmp * POWER(10000, wanyizhao_map(str));
      tmp         := 0;
      tmp2        := 0;
    ELSIF str IN ('十', '百', '千') THEN
      --當碰到十百千時
      tmp  := tmp + tmp2 * POWER(10, shibaiqian_map(str));
      tmp2 := 0;
    ELSE
      --當碰到數字時
      tmp2 := ling_jiu_map(str);
    END IF;
  END LOOP;

  --最後將沒有小於萬位數加到整數中去
  tmp         := tmp + tmp2;
  returnvalue := returnvalue + tmp;

  IF float_part IS NOT NULL THEN
    --計算小數部分
    k   := 0;
    tmp := '';
 
    FOR k IN 1 .. LENGTH(float_part) LOOP
      tmp := tmp || ling_jiu_map(SUBSTR(float_part, k, 1));
    END LOOP;
 
    returnvalue := returnvalue || '.' || tmp;
  END IF;

  RETURN returnvalue;
END;

wKiom1cfZLmw6ryhAAA-0INTaR0455.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章