irport报表,把数字金额转换成大写人民币金额

摘要:
1.编写oracle函数CREATEORREPLACE FunctionMoneyToChinese(MoneyInNumber)ReturnVarchar2IstrYuanVarchar2(150);strYuanFenVarchar2(152);numLenYuan编号;numLenYuanFen编号;strRstYuanVarchar2(600);strRstFenVarch公司

1、编写oracle函数

CREATE OR REPLACE Function MoneyToChinese(Money In Number) Return Varchar2 Is
  strYuan       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);
Begin
  If Money Is Null Then
    Return Null;
  End If;
  strYuan := TO_CHAR(FLOOR(Money));
  If strYuan = '0' Then
    numLenYuan := 0;
    strYuanFen := lpad(TO_CHAR(FLOOR(Money * 100)), 2, '0');
  Else
    numLenYuan := length(strYuan);
    strYuanFen := TO_CHAR(FLOOR(Money * 100));
  End If;
  If strYuanFen = '0' Then
    numLenYuanFen := 0;
  Else
    numLenYuanFen := length(strYuanFen);
  End If;
  If numLenYuan = 0 Or numLenYuanFen = 0 Then
    strRst := '零元整';
    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 Loop
    j            := numLenYuan - i + 1;
    numUnitIndex := Mod(i, 8);
    If numUnitIndex = 0 Then
      numUnitIndex := 8;
    End If;
    If numUnitIndex = 1 And i > 1 Then
      strRstYuan := tabUnitMapping(9) || strRstYuan;
    End If;
    charCurrentNum := substr(strYuan, j, 1);
    If charCurrentNum <> 0 Then
      strRstYuan := tabNumMapping(charCurrentNum) ||
                    tabUnitMapping(numUnitIndex) || strRstYuan;
    Else
      If (i = 1 Or i = 5) Then
        If substr(strYuan, j - 3, 4) <> '0000' Then
          strRstYuan := tabUnitMapping(numUnitIndex) || strRstYuan;
        End If;
      Else
        If substr(strYuan, j + 1, 1) <> '0' Then
          strRstYuan := tabNumMapping(charCurrentNum) || strRstYuan;
        End If;
      End If;
    End If;
  End Loop;
  For i In -2 .. -1 Loop
    j              := numLenYuan - i;
    charCurrentNum := substr(strYuanFen, j, 1);
    If charCurrentNum <> '0' Then
      strRstFen := tabNumMapping(charCurrentNum) || tabUnitMapping(i) ||
                   strRstFen;
    End If;
  End Loop;
  If strRstYuan Is Not Null Then
    strRstYuan := strRstYuan || '元';
  End If;
  If strRstFen Is Null Then
    strRstYuan := strRstYuan || '整';
  Elsif length(strRstFen) = 2 And substr(strRstFen, 2) = '角' Then
    strRstFen := strRstFen || '整';
  End If;
  strRst := strRstYuan || strRstFen;
  --strRst := Replace(strRst, '亿零', '亿');
  --strRst := Replace(strRst, '万零', '万');
  Return strRst;
End MoneyToChinese;

 注:如需测试该函数,请复制到Oracle数据库中,右击函数名“MoneyToChinese”,选择“test” 进行测试,输入你想要的金额。

2、在irport的Database里面写查询语句调用MoneyToChinese函数

irport报表,把数字金额转换成大写人民币金额第1张

irport报表,把数字金额转换成大写人民币金额第2张

小结:

(SELECT moneytochinese((select sum(sod.ACTUAL_UNIT_PRICE * sod.ACTUAL_QUANTITY) from SALE_ORDER_DETAIL sod where sod.sale_order_no = oci.sell_order_no)) FROM dual) as majuscule_price
其中moneytochinese是函数名。sum(sod.ACTUAL_UNIT_PRICE * sod.ACTUAL_QUANTITY) 是总金额,加工数量*单价的和。

出处:https://www.cnblogs.com/dshore123/p/8033624.html

免责声明:文章转载自《irport报表,把数字金额转换成大写人民币金额》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sftp使用dcoker常用命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于VB日期与数字的转换(一)

VB中可将日期作为实数的一部分来存储。小数点左边的数值表示日期:小数点右边的数值表示时间。负的数值表示在1899 年 12 月 30 日 之前。所以每一天可以用一个整数来表示(以1899-12-30 为0,该日之后为正数,之前为负数) ,对于MSVB 的合法日期,即#100-1-1# 到#9999-12-31#,就有-657434~2958465来表示。...

Java实现 “ 将数字金额转为大写中文金额 ”

前言:输入数字金额参数,运行程序得到其对应的大写中文金额;例如:输入 12.56,输出 12.56 : 壹拾贰元伍角陆分;重点来了:本人亲测有效。 奉上代码:/*** @Title: ConvertUpMoney* @Description: 将数字金额转换为大写中文金额* @date: 2019年6月18日 下午10:52:27*/public clas...

罗马数字转换阿拉伯数字(Java版,考虑较为全面)

罗马数字转换阿拉伯数字(Java版,考虑较为全面) - li002qwe的专栏 - 博客频道 - CSDN.NET 罗马数字转换阿拉伯数字(Java版,考虑较为全面) 分类:小程序2009-09-01 20:231628人阅读评论(3)收藏举报 一. 前言 朋友的作业,本想在网上找个现成的改改就行啦。可是一番google、baidu之后,找到的要么...

关于Intege.valueOf()的使用

原文链接:https://blog.csdn.net/weixin_37650458/article/details/85212730 1.Integer. valueOf()方法的作用     Integer. valueOf()可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,String如果为Null或“”都会...

字母和数字的转换——Excel列名

    在用代码操作Excel的过程中(如OpenXml),会用到把列名转化为数字,然后再进行计算确认列处理。    把列名转化为数字很容易实现定位。下面分享的这两个方法的主要作用是:     (1)把字母转为数字, 如1转为A,AA转为27 ,然后进行处理;     (2)把数字转为字母,A->1,27->AA……(这个比较常用)。 1、字母...

postgresql 一些简单应用(分页,取前N条数据,nvl(),数据类型转换)

1.分页 select * from (   select     row_number() over() as rownum,     H.*   from tableName H ) where rownum between page1  and page2  2.取前N条数据 select * from (   select     row_numb...