刚在CNOUG看到有人提问如何用PL/SQL 实现小数转分数的问题,下面这段代码是我的实现,主要思路是将输入的整数及小数都分别取出,然后将小数写成以10的n次方的分数,再求其最大公约数,得到简化的分数,最后将整数及分数合并。代码里有一些处理细节,如负数处理,纯整数处理,纯小数处理等等。
create or replace function dftof(iStr number) return varchar2 as
--小数转分数
-- (decimal fraction) to fraction
--设计人:叶正盛
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;
测试结果
Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0
Connected as yzs
SQL> select dftof(0.4) from dual;
DFTOF(0.4)
--------------------------------------------------------------------------------
2/5
SQL> select dftof(3.4) from dual;
DFTOF(3.4)
--------------------------------------------------------------------------------
3+2/5
SQL> select dftof(-92.25) from dual;
DFTOF(-92.25)
--------------------------------------------------------------------------------
-(92+1/4)
SQL> select dftof(-0.375) from dual;
DFTOF(-0.375)
--------------------------------------------------------------------------------
-(3/8)
SQL> select dftof(-.375) from dual;
DFTOF(-.375)
--------------------------------------------------------------------------------
-(3/8)
分享到:
相关推荐
ORACLE PL/SQL编程之八ORACLE PL/SQL编程之八ORACLE PL/SQL编程之八ORACLE PL/SQL编程之八
oracle pl/sql 编程大全,希望能对想学oracle或者oracle新手以及需要用到这方面知识的朋友有点帮助。
《Oracle PL/SQL程序设计(第5版)(套装上下册)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何...
Oracle PL/SQL实例编程 Oracle PL/SQL实例编程 Oracle PL/SQL实例编程
pl/sql 编程和oracle的函数查询,非常好用,欢迎下载
Oracle PL/SQL 编程手册Oracle PL/SQL 编程手册
Oracle PL/SQL实例精解 student模式 数据库建立代码 包括数据库的建立、索引等。样本数据的插入。
Oracle PL/SQL 编程手册(SQL大全), 学习Oracle有用。
PL/SQL是Oracle对标准数据库语言的扩展,Oracle公司已经将PL/SQL整合到Oracle 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本教程将以循速渐进的方式讲述PL/SQL基础语法,结构和组件、以及...
《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...
适合想学习Oracle PL/SQL编程的,有例子,也有最佳实践
Topics covered: How to use Oracle PL/SQL in all its manifestations through Oracle9i. Fundamentals of program structure (loops, cases, exceptions, etc.) and execution get attention, as do data types, ...
oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料
oracle pl/sql实例精讲student数据库模式
Considered the best Oracle PL/SQL programming guide by the Oracle community, this definitive guide is precisely what you need to make the most of Oracle’s powerful procedural language. The sixth ...
NULL 博文链接:https://elf8848.iteye.com/blog/740881
《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...
《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...
Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发
Oracle PL/SQL学习官方教材,英文版,覆盖了PL/SQL的所有知识,适合入门者或作为参考资料.