千家信息网

oracle中文数字转阿拉伯数字

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,CREATE OR REPLACE FUNCTION chi2num(chivalue IN VARCHAR2) RETURN NUMBER ISTYPE MAP IS TABLE OF BINARY
千家信息网最后更新 2025年01月20日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;

0