写个oracle函数,将小数转换为分数,再用字段截取方式转换为比例即可(这个函数有漏洞,无限循环小数位求出来有问题)针对无限循环小数,思路有可以自己实现,1位循环=小数点后第一位/9 二位循环=小数点后两位/99依次类推
CREATE OR REPLACE
FUNCTION dftof(iStr NUMBER) RETURN varchar2 AS
--小数转分数
v_Str varchar(50);
RESULT varchar(50);
v_fh varchar(1);
--负数符号
v_zs varchar2(20);
--整数
v_xs varchar2(20);
--小数
v_pos int;
--小数点位置
v_fm integer;
--分母
v_fz integer;
--分子
v_zdgys integer;
--最大公约数
--求最大公约数
FUNCTION getZDGYS(iNum1 integer,
iNum2 integer) RETURN integer AS v_ys integer;
--余数
v_num1 integer;
v_num2 integer;
BEGIN
v_num1 := iNum1;
v_num2 := iNum2;
v_ys := MOD(v_num1,
v_num2);
--辗转相除法
WHILE v_ys <> 0
LOOP
v_num1 := v_num2;
v_num2 := v_ys;
v_ys := MOD(v_num1,
v_num2);
END
LOOP;
RETURN v_num2;
END;
BEGIN
v_Str := trim(iStr);
v_pos := instr(v_Str, '.');
--计算小数点位置
IF v_pos = 0 THEN RESULT := v_Str;
--纯整数
ELSE
IF
substr(v_Str, 1, 1) = '-' THEN v_zs := substr(v_Str, 2, v_pos - 2);
--整数
ELSE v_zs := substr(v_Str, 1, v_pos - 1);
--整数
END
IF;
v_xs := substr(v_Str, v_pos + 1);
--小数
IF to_number(nvl(v_zs, '0')) = 0 THEN
IF
substr(v_zs, 1, 1) = '-' THEN v_zs := '-';
--如果整数为-0则显示负号
ELSE v_zs := '';
--如果整数为0则不显示整数
END
IF;
ELSE v_zs := v_zs || '+';
--整数部份显示样式
END
IF;
v_fz := to_number(v_xs);
--分子
v_fm := power(10, LENGTH(v_xs));
--分母
v_zdgys := getZDGYS(v_fm,
v_fz);
--求最大公约数
RESULT := (v_fz / v_zdgys) || '/' || (v_fm / v_zdgys);
IF
substr(v_Str, 1, 1) = '-' THEN RESULT := '-(' || v_zs || RESULT || ')';
ELSE RESULT := v_zs || RESULT;
END
IF;
END
IF;
RETURN RESULT;
END;