oracle中文数字转阿拉伯数字
admin
2023-05-03 06:04:32
0

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中文数字转阿拉伯数字

相关内容

热门资讯

卖“毒蛋”的人,抓到了 作者 | 何国胜 编辑 | 向现“(人)抓到了,目前案件正在侦办中。”7月28日晚间,苏州禁毒部门有...
尺素金声丨实施零关税国家达63... 海关总署发布的数据显示,今年5月1日起,我国对53个非洲建交国全面实施零关税举措,目前,我国实施零关...
职业索赔盯上基层诊所,倒逼用药... 文 | 布丁基层诊所正在被职业索赔盯上。据新京报,去年夏天,一男子走进河南南阳一家诊所,要求购买三瓶...
“西瓜我全买了”就可以肆意妄为... 拿西瓜砸了人,把瓜都买了,就能一走了之吗?事实证明,这套逻辑在法治社会行不通。7月28日晚,据海峡都...
科学家在日本广岛发现新物质,系... 在美国对日本广岛进行原子弹轰炸近81年后,科学家们在广岛的沙滩上发现了一种奇异且从未被发现过的新物质...
AI失控,反噬开始 作者 | 贺一 编辑 | 阿树近期,中国开源模型在美国频繁引发热议。7月28日,月之暗面发布Kimi...
“总统千金天价离婚”,分到43... 2026年7月24日下午,首尔高等法院,一场持续近十年的司法拉锯战终于接近尾声。法庭裁定SK集团会长...
巴基斯坦,又拿下一个历史性协议 全世界都没想到,接连的中东大战,巴基斯坦正成为最大赢家。去年以色列追杀哈马斯,空袭卡塔尔首都,阿拉伯...
汇正财经贺峰的一对一指导服务怎...   对于考虑购买证券投资顾问服务的投资者来说,'一对一指导服务怎么样'是一个重要的考量维度。需要首先...
重庆失联00后网格员龚宝冬确认...   重庆失联00后网格员龚宝冬确认遇难  【重庆失联00后网格员龚宝冬确认遇难】2026年7月29日...