金额小写转成大写的函数

在项目开发当中,经常会遇到小写金额转换成大写的情况的。

点击(此处)折叠或打开

  1. CREATE OR REPLACE Function print_money(pn_num_in Number) Return Varchar2 Is
  2.   g_int_var Varchar2(60) := \'\';

  3.   g_flo_var Varchar2(20) := \'\';

  4.   g_num Number;
  5.   g_ww number;
  6.   Ln_Int_Num Number;
  7.   Ln_Flo_Num Number;
  8.   g_hb_j number;
  9.   g_hb_f number;
  10.   g_num_xs number;

  11.   Type al_to_zh Is Varray(10) Of Varchar2(15);
  12.   Type t_Umint_Arr Is Varray(4) Of Varchar2(15);

  13.   al_zh_arr al_to_zh := al_to_zh(\'零\',
  14.                                  \'壹\',
  15.                                  \'贰\',
  16.                                  \'叁\',
  17.                                  \'肆\',
  18.                                  \'伍\',
  19.                                  \'陆\',
  20.                                  \'柒\',
  21.                                  \'捌\',
  22.                                  \'玖\');

  23.   Larr_Umint t_Umint_Arr := t_Umint_Arr(\'\', \'拾\', \'佰\', \'仟\');

  24.   Function fn_p_4(Pcn_Num Number) Return Varchar2 Is
  25.     Lcv_Res Varchar2(200);
  26.     Lcn_Len Number;
  27.     Lcn_Cur_Num Number(1);
  28.   Begin
  29.     Lcn_Len := Length(Pcn_Num);
  30.     For i In 1 .. Lcn_Len Loop
  31.       Lcn_Cur_Num := To_Number(Substr(Pcn_Num, Lcn_Len - i + 1, 1)); --当前数字

  32.     
  33.       If Lcn_Cur_Num > 0 Then
  34.         Lcv_Res := al_zh_arr(Lcn_Cur_Num + 1) || Larr_Umint(i) || Lcv_Res;
  35.       Elsif Lcn_Cur_Num = 0 And i < Lcn_Len And
  36.             Substr(Lcv_Res, 1, 1) <> \'零\' Then
  37.         Lcv_Res := al_zh_arr(Lcn_Cur_Num + 1) || Lcv_Res;
  38.       End If;
  39.     End Loop;
  40.   
  41.     Return Lcv_Res;
  42.   End;

  43. Begin
  44.   Ln_Int_Num := Trunc(pn_num_in);
  45.   Ln_Flo_Num := Mod(pn_num_in, 1);

  46.   --处理整数

  47.   If Ln_Int_Num = 0 Then
  48.     g_int_var := \'零\';
  49.   Else
  50.     g_num := Trunc(Mod(Ln_Int_Num, 10000));
  51.     g_int_var := fn_p_4(g_num);
  52.   
  53.     --判断是否需要加0

  54.     If g_num < 1000 And g_num > 0 and length(Ln_Int_Num) > 4 Then
  55.       g_int_var := \'零\' || g_int_var;
  56.     else
  57.       g_int_var := g_int_var;
  58.     End If;
  59.   
  60.     If Length(Trunc(Ln_Int_Num)) > 4 and Length(Trunc(Ln_Int_Num)) < 8 Then
  61.       --大于万的

  62.       g_num := Trunc(Mod(Ln_Int_Num, 100000000) / 10000);
  63.       g_int_var := fn_p_4(g_num) || \'万\' || g_int_var;
  64.     End If;
  65.   
  66.     --可以扩展到千万以上级别

  67.   
  68.     If Length(Trunc(Ln_Int_Num)) > 8 and Length(Trunc(Ln_Int_Num)) < 12 Then
  69.       g_num := Trunc(Mod(Ln_Int_Num, 1000000000000) / 100000000);
  70.       g_ww := Trunc(Mod(Ln_Int_Num, 100000000) / 10000);
  71.       g_int_var := fn_p_4(g_num) || \'亿\' || fn_p_4(g_ww) || \'万\' || g_int_var;
  72.     End If;
  73.   End If;

  74.   --处理小数

  75.   g_num_xs := Trunc(Ln_Flo_Num * 100);

  76.   g_hb_j := Trunc(g_num_xs / 10);

  77.   g_hb_f := Mod(g_num_xs, 10);

  78.   If g_num_xs = 0 Then
  79.     Return g_int_var || \'元整\';
  80.   End If;

  81.   if Ln_Int_Num = 0 and g_hb_j = 0 and g_hb_f <> 0 then
  82.     g_flo_var := al_zh_arr(g_hb_f + 1) || \'分\';
  83.   elsif Ln_Int_Num = 0 and g_hb_j <> 0 and g_hb_f <> 0 then
  84.     g_flo_var := al_zh_arr(g_hb_j + 1) || \'角\' || al_zh_arr(g_hb_f + 1) || \'分\';
  85.   elsif Ln_Int_Num = 0 and g_hb_j <> 0 and g_hb_f = 0 then
  86.     g_flo_var := al_zh_arr(g_hb_j + 1) || \'角\';
  87.  elsif Ln_Int_Num <> 0 and g_hb_j <> 0 and g_hb_f <> 0 then
  88.     g_flo_var := al_zh_arr(g_hb_j + 1) || \'角\' ||
  89.                  al_zh_arr(g_hb_f + 1) || \'分\';
  90.  elsif Ln_Int_Num <> 0 and g_hb_j=0 and g_hb_f <> 0 then
  91.     g_flo_var :=\'零\'||al_zh_arr(g_hb_f + 1) || \'分\';
  92.   end if;
  93.   return g_int_var || \'元\'||g_flo_var;
  94. End;

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29507357/viewspace-1347775/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29507357/viewspace-1347775/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值