CREATE OR REPLACE FUNCTION NUMBER_TO_CHINESE(P_NUM IN NUMBER DEFAULT NULL)RETURN NVARCHAR2 IS/*Ver:1.0 Created By xsb on 2003-8-18 For:将金额数字(单位元)转换为大写(采用从低至高算法)数字整数部分不得超过16位,可以是负数。Ver:1.1 Modified By xsb on 2003-8-20 For:个位数处理也放在For循环中。Ver:1.2 Modified By xsb on 2003-8-22 For:分后不带整字。Ver:1.3 Modified By xsb on 2003-8-28 For:完善测试用例。测试用例:SET HEAD OFFSET FEED OFFselect '无参数时='||NUMBER_TO_CHINESE() from dual;select 'null='||NUMBER_TO_CHINESE(null) from dual;select '0='||NUMBER_TO_CHINESE(0) from dual;select '0.01='||NUMBER_TO_CHINESE(0.01) from dual;select '0.126='||NUMBER_TO_CHINESE(0.126) from dual;select '01.234='||NUMBER_TO_CHINESE(01.234) from dual;select '10='||NUMBER_TO_CHINESE(10) from dual;select '100.1='||NUMBER_TO_CHINESE(100.1) from dual;select '100.01='||NUMBER_TO_CHINESE(100.01) from dual;select '10000='||NUMBER_TO_CHINESE(10000) from dual;select '10012.12='||NUMBER_TO_CHINESE(10012.12) from dual;select '20000020.01='||NUMBER_TO_CHINESE(20000020.01) from dual;select '3040506708.901='||NUMBER_TO_CHINESE(3040506708.901) from dual;select '40005006078.001='||NUMBER_TO_CHINESE(40005006078.001) from dual;select '-123456789.98='||NUMBER_TO_CHINESE(-123456789.98) from dual;select '123456789123456789.89='||NUMBER_TO_CHINESE(123456789123456789.89) from dual;test*/RESULT      NVARCHAR2(100); --返回字符串NUM_ROUND   NVARCHAR2(100) := TO_CHAR(ABS(ROUND(P_NUM, 2))); --转换数字为小数点后2位的字符(正数)NUM_LEFT    NVARCHAR2(100); --小数点左边的数字NUM_RIGHT   NVARCHAR2(2); --小数点右边的数字STR1        NCHAR(10) := '零壹贰叁肆伍陆柒捌玖'; --数字大写STR2        NCHAR(16) := '元拾佰仟万拾佰仟亿拾佰仟万拾佰仟'; --数字位数(从低至高)NUM_PRE     NUMBER(1) := 1; --前一位上的数字NUM_CURRENT NUMBER(1); --当前位上的数字NUM_COUNT   NUMBER := 0; --当前数字位数NUM1        NUMBER;BEGINIF P_NUM IS NULL THENRETURN NULL;END IF; --转换数字为null时返回nullSELECT 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_LEFTFROM DUAL; --取得小数点左边的数字SELECT SUBSTR(TO_CHAR(NUM_ROUND),DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),0,LENGTH(NUM_ROUND) + 1,INSTR(TO_CHAR(NUM_ROUND), '.') + 1),2)INTO NUM_RIGHTFROM DUAL; --取得小数点右边的数字SELECT CASEWHEN LENGTH(NUM_LEFT) >= 8 THENTO_NUMBER(SUBSTR(TO_CHAR(NUM_LEFT), -8, 4))ELSETO_NUMBER(SUBSTR(TO_CHAR(NUM_LEFT),-LENGTH(NUM_LEFT),LENGTH(NUM_LEFT) - 4))ENDINTO NUM1FROM DUAL; ---取得千、百、十、万位上的数字IF LENGTH(NUM_LEFT) > 16 THENRETURN '**********';END IF; --数字整数部分超过16位时--采用从低至高的算法,先处理小数点右边的数字IF LENGTH(NUM_RIGHT) = 2 THENIF TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) = 0 THENRESULT := '零' ||SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 2, 1)) + 1, 1) || '分';ELSERESULT := SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) + 1, 1) || '角' ||SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 2, 1)) + 1, 1) || '分';END IF;ELSIF LENGTH(NUM_RIGHT) = 1 THENRESULT := SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) + 1, 1) || '角整';ELSERESULT := '整';END IF;--再处理小数点左边的数字FOR I IN REVERSE 1 .. LENGTH(NUM_LEFT) LOOP--(从低至高)NUM_COUNT   := NUM_COUNT + 1; --当前数字位数NUM_CURRENT := TO_NUMBER(SUBSTR(NUM_LEFT, I, 1)); --当前位上的数字IF NUM_CURRENT > 0 THEN--当前位上数字不为0按正常处理RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1) ||SUBSTR(STR2, NUM_COUNT, 1) || RESULT;ELSE--当前位上数字为0时IF NUM_COUNT = 5 THENIF MOD(NUM_COUNT - 1, 4) = 0 AND NUM1 <> 0 THENRESULT  := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;NUM_PRE := 0; --元、万,亿前不准加零 --当前位是元、万或亿时END IF;ELSEIF MOD(NUM_COUNT - 1, 4) = 0 THENRESULT  := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;NUM_PRE := 0; --元、万,亿前不准加零END IF;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 P_NUM < 0 THEN--转换数字是负数时RESULT := '负' || RESULT;END IF;RETURN RESULT;EXCEPTIONWHEN OTHERS THENRAISE_APPLICATION_ERROR(-20001, '数字转换大写出现错误!' || SQLERRM);
END;
CREATE OR REPLACE FUNCTION money_to_chinese (money IN VARCHAR2)RETURN VARCHAR2
ISc_money    VARCHAR2 (12);m_string   VARCHAR2 (60) := '分角圆拾佰仟万拾佰仟亿';n_string   VARCHAR2 (40) := '壹贰叁肆伍陆柒捌玖';b_string   VARCHAR2 (80);n          CHAR;len        NUMBER (3);i          NUMBER (3);tmp        NUMBER (12);is_zero    BOOLEAN;z_count    NUMBER (3);l_money    NUMBER;l_sign     VARCHAR2 (10);
BEGINl_money := ABS (money);IF money < 0THENl_sign := '负';ELSEl_sign := '';END IF;tmp := ROUND (l_money, 2) * 100;c_money := RTRIM (LTRIM (TO_CHAR (tmp, '999999999999')));len := LENGTH (c_money);is_zero := TRUE;z_count := 0;i := 0;WHILE i < lenLOOPi := i + 1;n := SUBSTR (c_money,i,1);IF n = '0'THENIF len - i = 6 OR len - i = 2 OR len = iTHENIF is_zeroTHENb_string := SUBSTR (b_string,1,LENGTH (b_string) - 1);is_zero := FALSE;END IF;IF len - i = 6THENb_string := b_string || '万';END IF;IF len - i = 2THENb_string := b_string || '圆';END IF;IF len = iTHENb_string := b_string || '整';END IF;z_count := 0;ELSEIF z_count = 0THENb_string := b_string || '零';is_zero := TRUE;END IF;z_count := z_count + 1;END IF;ELSEb_string :=b_string|| SUBSTR (n_string,TO_NUMBER (n),1)|| SUBSTR (m_string,len - i + 1,1);z_count := 0;is_zero := FALSE;END IF;END LOOP;b_string := l_sign || b_string;RETURN b_string;
EXCEPTIONWHEN OTHERSTHENRETURN (SQLERRM);
END;
CREATE OR REPLACE FUNCTION SMALITOBLG(SMALLMONEY VARCHAR2
)
RETURN VARCHAR2 ISBIGWRITE VARCHAR2(54); -- 用于负担会答谢的钱数BIGNUM VARCHAR(2);     -- 用于存放每一个阿拉伯数字对应的汉子RMB VARCHAR(2);        -- 用于存放人民币单位MONEYPLACE NUMBER;     -- 用于确定人民币的精度,最多只能精确到分DOTPLACE NUMBER;       -- 确定小数点的位置MONEYNUM NUMBER;       -- 人民币的位置MYEXCEPTION EXCEPTION; -- 自定义异常
BEGINDOTPLACE := INSTR(SMALLMONEY,'.');IF(LENGTH(SMALLMONEY) > 14) OR ((LENGTH(SMALLMONEY) > 12) AND (DOTPLACE = 0)) THENRAISE MYEXCEPTION;END IF;IF DOTPLACE = 0 THENMONEYPLACE := 0;ELSEMONEYPLACE := DOTPLACE - LENGTH(SMALLMONEY);END IF;FOR MONEYNUM IN REVERSE 1..LENGTH(SMALLMONEY) LOOPIF MONEYNUM <> DOTPLACE THENCASE SUBSTR(SMALLMONEY,MONEYNUM,1)WHEN '1' THEN BIGNUM := '壹';WHEN '2' THEN BIGNUM := '贰';WHEN '3' THEN BIGNUM := '叁';WHEN '4' THEN BIGNUM := '肆';WHEN '5' THEN BIGNUM := '伍';WHEN '6' THEN BIGNUM := '陆';WHEN '7' THEN BIGNUM := '柒';WHEN '8' THEN BIGNUM := '捌';WHEN '9' THEN BIGNUM := '玖';WHEN '0' THEN BIGNUM := '零';END CASE;CASE MONEYPLACEWHEN '-2' THEN RMB := '分';WHEN '-1' THEN RMB := '角';WHEN '0' THEN RMB := '元';WHEN '1' THEN RMB := '拾';WHEN '2' THEN RMB := '佰';WHEN '3' THEN RMB := '仟';WHEN '4' THEN RMB := '萬';WHEN '5' THEN RMB := '拾';WHEN '6' THEN RMB := '佰';WHEN '7' THEN RMB := '仟';WHEN '8' THEN RMB := '亿';WHEN '9' THEN RMB := '拾';WHEN '10' THEN RMB := '佰';WHEN '11' THEN BIGNUM := '仟';END CASE;MONEYPLACE := MONEYPLACE + 1;IF BIGWRITE IS NULL THENBIGWRITE := BIGNUM || RMB;ELSEBIGWRITE := BIGNUM || RMB || BIGWRITE;END IF;END IF;END LOOP;RETURN BIGWRITE;EXCEPTION -- 异常处理部分WHEN MYEXCEPTION THENDBMS_OUTPUT.PUT_LINE('该函数只能转换长度不大于14位或整数位不大于12位的钱数!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('不是有效的钱数!');
END SMALITOBLG;
Create Or Replace Function Money2Chinese(Money In Number) Return Varchar2 IsstrYuan       Varchar2(150);strYuanFen    Varchar2(152);numLenYuan    Number;numLenYuanFen Number;strRstYuan    Varchar2(600);strRstFen     Varchar2(200);strRst        Varchar2(800);Type typeTabMapping Is Table Of Varchar2(2) Index By Binary_Integer;tabNumMapping  typeTabMapping;tabUnitMapping typeTabMapping;numUnitIndex   Number;i              Number;j              Number;charCurrentNum Char(1);
BeginIf Money Is Null ThenReturn Null;End If;strYuan := TO_CHAR(FLOOR(Money));If strYuan = '0' ThennumLenYuan := 0;strYuanFen := lpad(TO_CHAR(FLOOR(Money * 100)), 2, '0');ElsenumLenYuan := length(strYuan);strYuanFen := TO_CHAR(FLOOR(Money * 100));End If;If strYuanFen = '0' ThennumLenYuanFen := 0;ElsenumLenYuanFen := length(strYuanFen);End If;If numLenYuan = 0 Or numLenYuanFen = 0 ThenstrRst := '零圆整';Return strRst;End If;tabNumMapping(0) := '零';tabNumMapping(1) := '壹';tabNumMapping(2) := '贰';tabNumMapping(3) := '叁';tabNumMapping(4) := '肆';tabNumMapping(5) := '伍';tabNumMapping(6) := '陆';tabNumMapping(7) := '柒';tabNumMapping(8) := '捌';tabNumMapping(9) := '玖';tabUnitMapping(-2) := '分';tabUnitMapping(-1) := '角';tabUnitMapping(1) := '';tabUnitMapping(2) := '拾';tabUnitMapping(3) := '佰';tabUnitMapping(4) := '仟';tabUnitMapping(5) := '万';tabUnitMapping(6) := '拾';tabUnitMapping(7) := '佰';tabUnitMapping(8) := '仟';tabUnitMapping(9) := '亿';For i In 1 .. numLenYuan Loopj            := numLenYuan - i + 1;numUnitIndex := Mod(i, 8);If numUnitIndex = 0 ThennumUnitIndex := 8;End If;If numUnitIndex = 1 And i > 1 ThenstrRstYuan := tabUnitMapping(9) || strRstYuan;End If;charCurrentNum := substr(strYuan, j, 1);If charCurrentNum <> 0 ThenstrRstYuan := tabNumMapping(charCurrentNum) ||tabUnitMapping(numUnitIndex) || strRstYuan;ElseIf (i = 1 Or i = 5) ThenIf substr(strYuan, j - 3, 4) <> '0000' ThenstrRstYuan := tabUnitMapping(numUnitIndex) || strRstYuan;End If;ElseIf substr(strYuan, j + 1, 1) <> '0' ThenstrRstYuan := tabNumMapping(charCurrentNum) || strRstYuan;End If;End If;End If;End Loop;For i In -2 .. -1 Loopj              := numLenYuan - i;charCurrentNum := substr(strYuanFen, j, 1);If charCurrentNum <> '0' ThenstrRstFen := tabNumMapping(charCurrentNum) || tabUnitMapping(i) ||strRstFen;End If;End Loop;If strRstYuan Is Not Null ThenstrRstYuan := strRstYuan || '圆';End If;If strRstFen Is Null ThenstrRstYuan := strRstYuan || '整';Elsif length(strRstFen) = 2 And substr(strRstFen, 2) = '角' ThenstrRstFen := strRstFen || '整';End If;strRst := strRstYuan || strRstFen;--strRst := Replace(strRst, '亿零', '亿');--strRst := Replace(strRst, '万零', '万');Return strRst;
End Money2Chinese;

oracle里存储函数将金额数字转换成大写相关推荐

  1. php数值变成函数,PHP实现金额数字转换成大写函数

    最近做一个财务的一个功能,其中有一个地方需要将阿拉伯数字形式的金额显示成大写(老写)的汉字形式,于是有了下面的代码... function num_to_upper($num) { $d = arra ...

  2. php数字转英文,PHP金额数字转换成英文

    PHP金额数字转换成英文 $numTable[40]="FORTY "; $numTable[50]="FIFTY "; $numTable[60]=" ...

  3. android金额大小写转换,Java/android 金额 数字转成大写汉子

    今天翻看自己的代码,发现了自己写的金额数字转成大写的代码,当然我也是在别人的基础上修改的,当时从网上copy了一份代码,发现能用,但是有很多bug,然后自己在别人的基础上修改了一番,满足了自己的应用! ...

  4. C语言-如何将用户输入的金额数字转换成中文大写?

    实战: 如何将用户输入的金额数字转换成中文大写? #include <stdio.h>int main() {// 输入金额转换成大写int money; // 输入数字int money ...

  5. 金额数字转换成中文写法

    import java.math.BigDecimal; /** * <p> * Title: 金额数字转换成中文写法 * </p> * <p> * Descrip ...

  6. 使用 C# 将数字转换成大写人民币

    贴段最近在项目中用到的一个函数. 因涉及到财务,需要把数字符转换成大写人民币汉字,于是自己动手写了一个,使用的算法比较笨,各位看客不要笑啊. 可转换数字大小在10亿以下,超过的,就无能为力了,不过大家 ...

  7. C小程序-将输入的数字转换成大写汉字

    C小程序-将输入的数字转换成大写汉字C int money,count=0;int i=0;int moneys[6];//定义了输入数字的最高位数char unit[10][2]={"零& ...

  8. 小写数字转换成大写数字

    前两天看到一道题,关于小写数字转换成大写的.也就是将"1023050405"这样的数字转换为"十亿二千三百零五万零四百零五". 这个是个算法问题,其它语言也是相 ...

  9. 将(123)数字转换成大写数字(壹,贰,弎)

    此方法 将(123)数字转换成大写数字(壹,贰,弎) RMBUtils.toChineseUnit()

最新文章

  1. FFmpeg从入门到出家(HEVC在RTMP中的扩展)
  2. 报名丨图神经网络前沿学术研讨会:清北高校vs企业,9位学者联袂分享
  3. copy elison RVO NRVO
  4. Asp.Net中替代Eval的两种方式
  5. 时频分析:短时傅立叶变换实现(5)
  6. python接口测试类型_python 接口测试字符类型转换
  7. 【深度学习】我用 PyTorch 复现了 LeNet-5 神经网络(CIFAR10 数据集篇)!
  8. Android菜鸟的成长笔记(13)——异步任务(Async Task)
  9. java 栈 大小_java – JVM堆栈大小规范
  10. VS2008中开发Silverlight 2.0的配置
  11. 面试被问 Go 的map[int64]int64 在 redis 会占多少空间...
  12. 51nod 1106 质数检测
  13. Cannot uninstall ‘requests’. It is a distutils installed project and thus we cannot accurately deter
  14. 支持向量机总结(SVM)
  15. 组态软件android版,昆仑通态组态软件
  16. 中国软件三季度业绩预测,中国软件股票趋势预测
  17. 《人工智能:一种现代的方法》读书笔记之 智能Agent
  18. MFC 鼠标画线总结
  19. 2018携程实习生大数据分析笔试练习题
  20. 长沙县:红红火火过大年 文化惠民暖人心

热门文章

  1. SEO在网页中的应用
  2. 超全zookeeper知识点与实战
  3. deepin20系统选择手动安装盘_拯救老Macbook Air笔记本经验分享,用优盘安装最新苹果系统...
  4. CDA1级习题复习(2)
  5. 制作ubuntu光盘启动盘
  6. Hive:命令行界面、数据类型、DDL数据定义(数据库及表操作/分区分桶)、DML数据操作(数据导入导出)
  7. ACM 海贼王之伟大航路(深搜剪枝)
  8. Win7x64系统过TP的一些尝试和目前遇到的问题
  9. 网 络 存 储 技 术
  10. C#程序设计实践课程设计之数字华容道