`
蔡华江
  • 浏览: 106160 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle函数将数字与汉字互相转化

阅读更多

这是一个oracle函数,可以将阿拉伯数字与汉字进行相互转化,如1234567890.0123可以转化为“十二亿三千四百五十六万七千八百九十点零一二三”,同样也可以将汉字转化为对应的数字。

该函数支持千兆下的浮点数字,但不支持指数形式。

/* Formatted on 2009/12/22 17:03 (Formatter Plus v4.8.8) */
CREATE OR REPLACE PACKAGE czutil
AS
   --将数字转化为汉字,支持千兆级数字的操作
   FUNCTION num2chi (numvalue IN NUMBER)
      RETURN VARCHAR2;

   --将汉字转化为数字,支持千兆级数字的操作
   FUNCTION chi2num (chivalue IN VARCHAR2)
      RETURN NUMBER;
END;

CREATE OR REPLACE PACKAGE BODY czutil
AS
   FUNCTION num2chi (numvalue IN NUMBER)
      RETURN VARCHAR2
   IS
      --汉字映射数字的映射表
      TYPE MAP IS TABLE OF VARCHAR2 (10)
         INDEX BY BINARY_INTEGER;

      ling_jiu_map     MAP;
      shibaiqian_map   MAP;
      wanyizhao_map    MAP;
      --临时变量
      i                INT            := 0;                       --'临时变量
      j                INT            := 0;                        --临时变量
      k                INT            := 0;                        --临时变量
      x                INT            := 0;                        --临时变量
      y                INT            := 0;                        --临时变量
      str              VARCHAR2 (100) := '';                       --临时变量
      tmp              VARCHAR2 (100) := '';                       --临时变量
      integer_part     VARCHAR2 (100) := '';               --数字形式整数部分
      float_part       VARCHAR2 (100) := '';               --数字形式小数部分
      returnvalue      VARCHAR2 (100) := '';                         --返回值
   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) := '兆';
      --将数字拆分为整数与浮点数两个数字数组
      i := INSTR (numvalue, '.', 1);

      IF i = 0
      THEN
         integer_part := SUBSTR (numvalue, 1);
      ELSE
         integer_part := FLOOR (numvalue);
         float_part := SUBSTR (numvalue, i + 1);
      END IF;

      --计算整数部分
      i := LENGTH (integer_part);
      j := CEIL (i / 4);
      k := 0;

      --将整数部分每四个分为一个组
      FOR k IN 0 .. j - 1
      LOOP
         IF k = 0
         THEN
            str := SUBSTR (integer_part, 1, i - 4 * j + 4);
         ELSE
            str := SUBSTR (integer_part, i - 4 * j + 4 * k + 1, 4);
         END IF;

         x := LENGTH (str);
         y := 0;
         tmp := '';

         --将每个组中数据转化为汉字
         FOR y IN 0 .. x - 1
         LOOP
            tmp :=
                  tmp
               || ling_jiu_map (SUBSTR (str, y + 1, 1))
               || shibaiqian_map (x - y - 1);
         END LOOP;

         --零处理
         tmp := RTRIM (tmp, '零');                  --去掉兆亿万前面个位上的零
         tmp := REGEXP_REPLACE (tmp, '(零[千百十])', '零');   --千百十位上的零
         tmp := REGEXP_REPLACE (tmp, '(零{2,})', '零'); --将千百十位上的零结合
         returnvalue := returnvalue || tmp || wanyizhao_map (j - k - 1);
      END LOOP;

      --零处理
      --去掉兆亿万上的零
      returnvalue := REGEXP_REPLACE (returnvalue, '(零[兆亿万])', '零');
      --将兆亿万位上的零结合
      returnvalue := REGEXP_REPLACE (returnvalue, '(零{2,})', '零');
      --简称十位上的一
      returnvalue := REGEXP_REPLACE (returnvalue, '^一十', '十');
      returnvalue := REGEXP_REPLACE (returnvalue, '零一十', '零十');

      --放进返回结果
      IF returnvalue IS NULL
      THEN
         returnvalue := '零';
      END IF;

      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;

   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;                       --'临时变量
      j                INT            := 0;                        --临时变量
      k                INT            := 0;                        --临时变量
      x                INT            := 0;                        --临时变量
      y                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;
END czutil;
分享到:
评论
3 楼 蔡华江 2011-08-26  
应该是select czutil.num2chi(23) from dual; 调用,至于为什么出错,还真不清楚
2 楼 远去的渡口 2011-08-26  
刚才想试试这个方法的效果,就在PL SQL中调用了,我知道调用存储过程是用call,所以就试了,
call call czutil.num2chi(23) ;

还有select czutil.num2chi(23) from dual;
怎么报“程序包或函数f_getcblrsl处于无效状态”,是不是哪里有拼写错误呢,我找了半天没看出来   还是我调用的不对呀
1 楼 远去的渡口 2011-08-26  
很强大,我还从来没有在Oracle中写过这样的方法。

相关推荐

    oracle数字转换中文

    oracle数字转换中文,用我们更好地开发财务模块

    汉字转拼音(全拼)Oracle函数

    参考了网上的SPELLCODE获得汉字首字母函数和f_getSpellcode函数,主要是把PIPE Row(spell_code('a', -20319))等内容改成了字符串再进行比较,效率提高了很多倍,基本响应速度在毫秒级。 在项目中得到了应用,像百度...

    oracle多选字典翻译函数.txt

    1、编写视图时遇到多选的字典编码需要转换多选的名称时,比如将‘1,2,3...’ 转换成‘是,否,未知’ 2、通过函数实现,传入值1)字段名,2)对应关系,返回翻译后的中文多选字符串。

    java面试题(JAVA代码与编程).pdf

    8、将一个键盘输入的数字转化成中文输出 (例如:输入:1234567 输出:一百二拾三万四千五百六拾七) 用java语言实现,,请编一段程序实现! 9、设计4个线程,其中两个线程每次对j 增加 1,另外两个线程对j每次减少1。写出...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能 Oracle P/L SQL实现发送Email、浏览网页等网络操作功能,以下是此过程包的头部,包体经常打包处理plb,感兴趣用户可以下载下来。 --.使用聚合函数实现 多行...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    字符被转化成数字,利用其最初位置。在PHP手册中有详细的例子。 数组与哈希表 数组与哈希表以同样的方法被支持。怎样运用取决于你怎样定义它们。你可以用list()或者array()来定义它们,也可以直接为数组赋值。数组...

    Java面试宝典2020修订版V1.0.1.doc

    它们可以相互转化吗?你倾向于用哪种,为什么? 54 39、oracle数据库表的备份及还原 54 40、谈谈你知道的数据库和中间件 54 41、oracle和MySQL的区别 54 42、简述Mysql的InnoDb 55 43、删除重复数据只保留一条。 55 ...

    C#编程经验技巧宝典

    70 <br>0096 如何将数字转换为字符串 70 <br>0097 如何将字符串转换为数字 70 <br>0098 如何将数字转换为日期格式 71 <br>0099 如何将数字转换为货币格式 71 <br>0100 将字母全部转换大写 ...

    Spring中文帮助文档

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

    java面试题

    84.8. 将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七),请用java语言编一段程序实现! 114 84.9. 题目1:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有...

    C#基类库(苏飞版)

    EcanConvertToCh C#将汉字转成拼音 PinYin 取汉字拼音的首字母,只要你输入一个汉字,或者是多个汉字就会取出相应的道字母,主要是方便查询使用的 复制代码 16.配置文件操作类 ConfigHelper 1.根据Key取Value值 2....

    asp.net知识库

    Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。 Tomcat也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理...

    基于J2EE框架的个人博客系统项目毕业设计论...

    你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。 Tomcat也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理...

    Spring API

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

Global site tag (gtag.js) - Google Analytics