温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

oracle中文数字转阿拉伯数字

发布时间:2020-06-22 01:12:54 来源:网络 阅读:1206 作者:yekang12 栏目:关系型数据库

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;

oracle中文数字转阿拉伯数字

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI