小写数字金额转大写

xiaoxiao2021-02-28  99

小写数字金额转大写

如: 564.21   to   伍佰陆拾肆圆贰角壹分

 CREATE OR REPLACE Function Money2Chinese(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 Money2Chinese; /

SQL> Select   Money2Chinese(564.21) From   dual; MONEY2CHINESE(564.21) ------------------------------------------------------------------------------------- 伍佰陆拾肆圆贰角壹分 SQL> Select   Money2Chinese(675567975667.96) From   dual; MONEY2CHINESE(675567975667.96) ------------------------------------------------------------------------------------- 陆仟柒佰伍拾伍亿陆仟柒佰玖拾柒万伍仟陆佰陆拾柒圆玖角陆分

转载请注明原文地址: https://www.6miu.com/read-37487.html

最新回复(0)