`

oracle实现阿拉伯数字转化为大写汉字的函数

阅读更多

今天工作中遇到了要改货币金额转换为大写显示的需求,找到了一些前辈们的代码,总结了一下贴出来,以备以后查看学习使用.

 

1.专门用于转化年份的函数TO_UPPER_YEAR.

CREATE OR REPLACE FUNCTION TO_UPPER_YEAR(YEAR_IN  IN VARCHAR2)
 RETURN VARCHAR2
/**
 *年转化为大写汉字的函数 如将2008转换为二〇〇八
 *月份和日期转换的可以调用 TO_UPPER_NUM 函数
 *如SELECT TO_UPPER_NUM('21','2','2') FROM DUAL
 *查询系统大写年月日如下:
 *SELECT TO_UPPER_YEAR(TO_CHAR(SYSDATE,'YYYY')) || '年' ||
 *       TO_UPPER_NUM(TO_CHAR(SYSDATE,'MM'),'2','2') || '月' ||
 *       TO_UPPER_NUM(TO_CHAR(SYSDATE,'DD'),'2','2') || '日'  SJ
 *FROM DUAL
 */
IS
  TEMP     VARCHAR2(32767);
  RESULT   VARCHAR2(32767);
  STR      VARCHAR2(32767) := '〇一二三四五六七八九';
BEGIN
  IF YEAR_IN IS NULL THEN
    RETURN NULL;
  END IF;
  FOR I IN 1 .. LENGTH(YEAR_IN)
   LOOP
     SELECT SUBSTR(STR, SUBSTR(YEAR_IN,I, 1) + 1, 1)
       INTO TEMP
       FROM DUAL;
     RESULT := RESULT || TEMP;
   END LOOP;
  RETURN RESULT;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    RETURN '';
END;
 

2.用于阿拉伯数字转化为大写汉字的函数TO_UPPER_NUM.

CREATE OR REPLACE FUNCTION TO_UPPER_NUM
(
  P_NUM   IN NUMBER DEFAULT NULL,
  P_ROUND NUMBER    DEFAULT 2,    --输出要保留的小数位数
  P_MONTH NUMBER    DEFAULT 1     --输出不为月份或者日时,当此参数输入不为1时,返回值为大写(非汉字)数字
)
  RETURN  NVARCHAR2
IS
  /**
   *阿拉伯数字转化为大写汉字的函数
   *输入参数转换前的数字,要保留的小数位数(4舍5入可以不输入,默认为小数点后2位)
   *输出参数为转化后的大写数字
   *支持小数点和负数,但数字整数部分不能超过16位
   *支持转换月份和日期,如 SELECT TO_UPPER_NUM('31','3','2') FROM DUAL
   *--日期例子(年份的转换见另一个函数)
   *  SELECT TO_UPPER_YEAR(TO_CHAR(SYSDATE,'YYYY')) || '年' ||
   *  TO_UPPER_NUM(TO_CHAR(SYSDATE,'MM'),'2','2') || '月' ||
   *  TO_UPPER_NUM(TO_CHAR(SYSDATE,'DD'),'2','2') || '日' 
   *  FROM DUAL ;
   *--货币例子(截取小数点后两位,四舍五入)
   *  SELECT TO_UPPER_NUM(1234.564) FROM dual ;
   */
   RESULT      NVARCHAR2(100) := ''; --返回大写汉字字符串
   NUM_ROUND   NVARCHAR2(100) := TO_CHAR(ABS(ROUND(P_NUM, P_ROUND))); --转换数字为小数点后p_round位的字符(正数)
   NUM_LEFT    NVARCHAR2(100);       --小数点左边的数字
   NUM_RIGHT   NVARCHAR2(100);       --小数点右边的数字
   STR1        NCHAR(10) := '零壹贰叁肆伍陆柒捌玖';             --数字大写
   STR2        NCHAR(16) := '点拾佰仟万拾佰仟亿拾佰仟万拾佰仟'; --数字位数(从低至高)
   STR3        NCHAR(10) := '〇一二三四五六七八九';             --月份数字大写
   STR4        NCHAR(16) := '点十佰仟万拾佰仟亿拾佰仟万拾佰仟'; --数字位数(从低至高)
   NUM_PRE     NUMBER(1) := 1;       --前一位上的数字
   NUM_CURRENT NUMBER(1);            --当前位上的数字
   NUM_COUNT   NUMBER := 0;          --当前数字位数
BEGIN
  --转换数字为NULL时,返回NULL
  IF P_NUM IS NULL THEN
    RETURN NULL;
  END IF;
  --如果要转换月份或者日时,则替换临时变量
  IF P_MONTH <> 1 THEN
    STR1 := STR3;
    STR2 := STR4;
  END IF;
  --取得小数点左边的数字
  SELECT TO_CHAR(NVL(SUBSTR(TO_CHAR(NUM_ROUND),
                            1,
                            DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),
                                   0,
                                   LENGTH(NUM_ROUND),
                                   INSTR(TO_CHAR(NUM_ROUND), '.') - 1)),
                     0))
    INTO NUM_LEFT
    FROM DUAL;
  --取得小数点右边的数字
  SELECT SUBSTR(TO_CHAR(NUM_ROUND),
                DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),
                       0,
                       LENGTH(NUM_ROUND) + 1,
                       INSTR(TO_CHAR(NUM_ROUND), '.') + 1),
                P_ROUND)
    INTO NUM_RIGHT
    FROM DUAL;
  --数字整数部分超过16位时.采用从低至高的算法,先处理小数点左边的数字
  IF LENGTH(NUM_LEFT) > 16 THEN
    RETURN '**********';
  END IF;
  FOR I IN REVERSE 1 .. LENGTH(NUM_LEFT) LOOP
    --(从低至高)
    NUM_CURRENT := TO_NUMBER(SUBSTR(NUM_LEFT, I, 1)); --当前位上的数字
    NUM_COUNT   := NUM_COUNT + 1;                     --当前数字位数
    --当前位上数字不为0按正常处理
    IF NUM_CURRENT > 0 THEN
     --如果转换数字最高位是十位,转换后不需要前面的壹,如月份12转换后为拾贰,则
      IF NUM_CURRENT = 1 AND P_MONTH <> 1 AND NUM_COUNT = 2 THEN
        RESULT :=  SUBSTR(STR2, NUM_COUNT, 1) || RESULT;
        STR1 := STR3;
      ELSE
        RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1)
                ||SUBSTR(STR2, NUM_COUNT, 1)
                || RESULT;
      END IF;
    ELSE
      --当前位上数字为0时
      IF MOD(NUM_COUNT - 1, 4) = 0 THEN
        --当前位是点、万或亿时
        RESULT  := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;
        NUM_PRE := 0; --点、万,亿前不准加零
      END IF;
      IF NUM_PRE > 0 OR LENGTH(NUM_LEFT) = 1 THEN
        --上一位数字不为0或只有个位时
        RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1) || RESULT;
      END IF;
    END IF;
    NUM_PRE := NUM_CURRENT;
  END LOOP;
  --再处理小数点右边的数字
  IF LENGTH(NUM_RIGHT) > 0 THEN
    FOR I IN 1 .. LENGTH(NUM_RIGHT) LOOP
      --(从高至低)
      NUM_CURRENT := TO_NUMBER(SUBSTR(NUM_RIGHT, I, 1)); --当前位上的数字
      RESULT      := RESULT || SUBSTR(STR1, NUM_CURRENT + 1, 1);
    END LOOP;
  ELSE
    RESULT := REPLACE(RESULT, '点', '');                 --无小数时去掉点
  END IF;
  --转换数字是负数时
  IF P_NUM < 0 THEN
    RESULT := '负' || RESULT;
  END IF;
  RETURN RESULT;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    RETURN '';
END;
分享到:
评论

相关推荐

    oracle 数字金额转为汉字大写

    总结来说,Oracle中将数字金额转换为汉字大写的过程涉及自定义函数的编写,通过映射数字到汉字字符并处理特殊格式要求,可以实现财务领域的规范化表示。`num2rmb`函数提供了一个实用的解决方案,但在实际使用时应...

    oracle中将小写金额转换为大写金额函数

    ### Oracle中将小写金额转换为大写金额的函数实现 在Oracle数据库中,有时我们需要将数字金额转换成中文大写形式,特别是在财务系统中,这样的功能非常实用且常见。本文将详细介绍一个自定义的Oracle函数`money_to_...

    oracle数字转换中文

    通过上述分析,我们可以看出,`money_to_chinese`函数巧妙地实现了将数字转换为中文大写的功能,不仅考虑到了数值的正负、大小,还通过精心设计的逻辑避免了冗余和错误的出现,确保了转换结果的准确性。这对于财务...

    oracle自定义函数实现金额转换为大写

    oracle数据库,使用自定义函数,实现了金额的大写转换。sql语句中,直接调用此函数即可得到金额大写。

    阿拉伯数字转换为中文小写数字

    总的来说,阿拉伯数字到中文小写数字的转换是Android应用本地化的一个重要环节,通过合理的字符映射和逻辑判断,我们可以实现高效且准确的转换功能。在实际编程中,不断优化和扩展此类功能,将有助于提升用户体验并...

    mysql oracle 阿拉伯数字转中文数字

    mysql oracle 阿拉伯数字转中文数字, 亲测可用.找了很长时间才找到,

    oracle通过sql实现字符串转数字oracle函数

    在Oracle数据库中,将字符串转换为数字是一项常见的操作,特别是在处理包含数字的字符串列时,可能需要进行数值计算或按照数值大小进行排序。本篇文章将深入探讨如何在SQL查询中利用Oracle提供的函数来实现这一目标...

    一个用 Oracle 编写货币大写转换(函数不支持转换小数点)

    一个用 Oracle 编写货币大写转换(函数不支持转换小数点) 最多可能转换21位数字

    Oracle中实现Split函数功能

    Oracle 中实现 Split 函数功能 Oracle 中实现 Split 函数功能是指在 Oracle 数据库中实现类似于 C# 等编程语言中的 Split 函数,用于拆分字符的功能。下面是实现 Oracle 中 Split 函数功能的详细介绍。 首先,...

    oracle批量修改汉字转拼音首字母的函数

    汉字转拼音是将汉字转换为对应的汉语拼音的过程,而获取首字母则是提取每个汉字拼音的第一个字母,通常是大写。在Oracle中,我们可以使用内置的UTL_I18N包或者自定义PL/SQL函数来实现这一转换。 UTL_I18N包中的`UTL...

    oracle汉字转拼音函数整理大全

    本篇文档详细介绍了两种用于转换汉字到拼音的自定义函数:`fn_getpyKGJG` 和 `fn_getpyWKG`。这些函数能够满足不同场景下对拼音格式的需求,比如是否包含空格分隔、大小写等。 #### 二、函数定义及使用方法 - **`fn...

    oracle姓名中文转全拼函数

    Oracle姓名中文转全拼函数是解决在Oracle数据库中处理中文姓名时的一个常见需求,特别是考虑到汉字的多样性和复杂性,包括生僻字和多音字的处理。此函数旨在将中文姓名转换为全拼,方便进一步的数据处理或搜索。下面...

    ORACLE CRC32函数

    在Oracle数据库中,`CRC32`函数是一种非常实用的功能,主要用于将字符类型的数据转换为一个唯一的数字类型,这一过程通常被称为散列(Hash)。通过该函数,可以方便地生成针对特定字符串的固定长度的数字签名,这...

    oracle自定义日期函数

    Oracle 日期处理函数是数据库管理系统中非常重要的一部分,最近看到有人在做 T-SQL 与 PL/SQL 的转化,问了些有关时间函数的处理。在 PL/SQL 中,Oracle 提供了其他的方法来处理日期函数,例如 DATE_ADD 函数。在 T-...

    oracle财务数字转换中文

    在Oracle数据库中,实现数字到中文大写金额的转换可以通过创建自定义函数来完成。这种函数通常会处理各种数字格式,包括正数、负数、零以及小数,并能正确地将其转换为中文大写形式。例如,数字“123456.78”应被...

    Oracle中金额大小写转换

    然而,Oracle本身并不直接支持将数字转换为汉字大写。因此,我们通常需要编写自定义的函数来完成这个任务。下面是一个简单的示例,展示如何创建一个PL/SQL函数来实现这个功能: ```sql CREATE OR REPLACE FUNCTION ...

    oracle小写人名币转大写人名币函数

    根据提供的文件信息,可以看出这是一个Oracle数据库中的自定义函数,用于将数字表示的小写人民币金额转换为汉字大写形式。此函数对于财务系统、银行系统等需要处理人民币金额大写显示的应用场景非常有用。 ### 函数...

    oracle函数大全 oracle函数大全

    除了上述函数,Oracle还提供其他很多函数,如TO_DATE用于将字符串转换为日期,TO_CHAR用于将日期转换为字符串,NVL用于处理NULL值,以及COUNT、SUM、AVG、MAX、MIN等聚合函数。了解并熟练使用这些函数,能极大地提高...

    oracle非数字合计,将字段中含有汉子的数据自动转换为 数字0

    根据提供的文件信息,本文将详细介绍如何实现“oracle非数字合计”,即将字段中含有汉字或其他非数字字符的数据自动转换为数字0的过程。 ### 一、问题背景 在实际工作中,可能会遇到这样的情况:某个字段中本应...

    oracle函数大全中文

    在这个"Oracle函数大全中文"资源中,包含了对Oracle数据库中各种函数的详细解释,这些函数涵盖了数值型、字符型、日期型、转换、聚组以及分析等多个方面。下面我们将逐一深入探讨这些重要的知识点。 1. 数值型函数...

Global site tag (gtag.js) - Google Analytics