破釜沉舟论坛 » WEB 开发 » [php] 数字金额 转 大写金额

2006-6-16 11:54 php店小二
[php] 数字金额 转 大写金额

因为急用
在网上也找到了现成的函数
不过感觉不爽
就自己写了一个
时间仓促,也没来得及优化!

[code]
<?php
/**
* @file
* @version 1.0
* @author   网海浪子
* @date 2006-6-16
* @email [email]sxf02615@163.com[/email]
* @brief   数字金额 转 大写金额
* @转载 请注明出处
*/

class moneyToChinese
{
   //数字金额
   var $numMoney        = null;

   //整数单位 可继续扩展
   var $intNumBit        = array(1=>"",2=>"拾",3=>"佰",4=>"仟",5=>"万",6=>"拾",7=>"佰",8=>"仟",9=>"亿",10=>"拾",11=>"佰",12=>"仟");

   //小数单位 可继续扩展
   var $floatNumBit    = array(1=>"角",2=>"分");

   //阿拉伯数字中文大写
   var $moneyOfNum        = array(0=>'零',1=>'壹',2=>'贰',3=>'叁',4=>'肆',5=>'伍',6=>'陆',7=>'柒',8=>'捌',9=>'玖');

   //数字金额的整数部分
   var $intNum         = null;

   //数字金额的小数部分
   var $floatNum        = null;

   //转换后的大写金额
   var $ChineseStr     = null;

   /**
   * @brief  构造函数
   *    
   * @param $num: 初始化数字金额
   *    
   * @return 无返回值
   */
   function moneyToChinese($num)
   {
       if(strlen($num)>12)
       {
           $this->ChineseStr = "位数暂时不能大于12位";
           return false;
       }
       if(is_int($num)||is_float($num))
       {
           $this->numMoney = strval($num);
           $data = moneyToChinese::expNum($num);
           $this->intNum    = $data['int'];
           $this->floatNum = $data['float'];
           $this->intToChinese($this->intNum);
           $this->ChineseStr.= "元";
           $this->floatToChinese($this->floatNum);
           $this->ChineseStr.= "整";
       }
   }

   /**
   * @brief  分割数为整数与小数 返回数组
   *    
   * @param $num: 金额
   *    
   * @return 如果是float数则返回整数和小数部分为字符串 如果是整数返回整数部分
   */
   function expNum($num)
   {
       $data['int']    = null;
       $data['float']    = null;
       if(is_int($num))
       {
           $data['int'] = $num;
           return $data;
       }
       else
       {
           $expArray = explode(".",$num);
           $data['int']    = $expArray[0];
           $data['float']  = $expArray[1];
           return $data;
       }
   }

   /**
   * @brief  初始化对象 this 转换整数部分
   *    
   * @param $intNum: 整数金额部分转换大写
   *    
   * @return 无返回值
   */
   function intToChinese($intNum)
   {
       if($intNum =='')return false;
       $num_index    = 0;//初始化数组小标从0开始
       $num_len    = strlen($intNum);//整数位的长度
       $pre_num    = 8;//初始化前序数为非零,null,false 值 避免与0冲突
       for($num_index;$num_index<$num_len;$num_index++)
       {
           $curr_num        = substr($intNum,$num_index,1);//从$num_index位置开始取1个数出来作为当前数
           $curr_bit_index    = $num_len-$num_index;//当前数的位数组下标
           if($curr_num!=0)
           {
               if($pre_num==0)    //当且仅当 前序数 为零 当前数不为零时 加 人民币"零"
               {
                   $this->ChineseStr.=$this->moneyOfNum[0];
               }
               $this->ChineseStr.=$this->moneyOfNum[$curr_num];
               $this->ChineseStr.=$this->intNumBit[$curr_bit_index];
           }
           else
           {
               $pre_zero_num    = 0;//前面三个前序数为0的位的个数
               $pre_num_index    = $num_index;
               $for_num        = 3;
               for($for_num=1;$for_num<=3;$for_num++)
               {
                   $pre_num_index--;
                   if(substr($intNum,$pre_num_index,1)!=0)$pre_zero_num++;
               }
               if($pre_zero_num!=0)
               {
                   if($curr_bit_index==5)$this->ChineseStr.="万";
                   if($curr_bit_index==9)$this->ChineseStr.="亿";
               }
           }
           $pre_num    = $curr_num;//用当前值初始化下次循环的前序数
       }
   }

   /**
   * @brief  初始化对象 this 转换小数部分
   *    
   * @param $intNum: 小数金额部分转换大写
   *    
   * @return 无返回值
   */
   function floatToChinese($floatNum)
   {
       if($floatNum =='')return false;
       $numLen        = strlen($floatNum);
       $pre_num    = null;
       $zero_num    = 0;
       for($i=0;$i<$numLen;$i++)
       {
           $j= $i+1;
           $num = substr($floatNum,$i,1);
           $pre_num = $num;
           if($pre_num == $num&&$pre_num ==0)
           {
               $zero_num++;
               if($zero_num==1)$this->ChineseStr.= "零";
               continue;
           }
           else
           {
               $pre_num    = null;
               $zero_num    = 0;
           }
           $this->ChineseStr.= $this->moneyOfNum[$num];
           $this->ChineseStr.= $this->floatNumBit[$j];
       }
   }
}
//echo "<pre>";
//$test = new moneyToChinese(100000000.12);
//print_r ($test);
?>
[/code]

2006-6-16 11:55 php店小二
请各位给我提提意见!
找找BUG
谢谢!

2006-6-17 21:21 木舟
支持一下原创!       感觉好像很久都没碰php了,   现在叫我写一个这样的东西, 可能都写不出来!

2006-6-17 21:59 路人甲
先申明,本人对PHP还很菜
只会捉点小虫
嘿嘿
超过10W,就出现问题了,138580 壹拾万叁万捌仟伍佰捌拾零元整
我觉得应该是:壹拾叁万捌仟伍佰捌拾零元整
呵呵,好象是超过5位的,读取就出现这样的问题了(我只是说问题哈,嘿嘿)
顶一个先,乘机多学点PHP的知识

2006-6-17 23:08 coldney
嗯。还是有一些地方要修改的。
1、
[php]var $intNumBit     = array(1=>"元",2=>"拾",3=>"佰",4=>"仟",5=>"万",6=>"拾万",7=>"佰万",8=>"仟万",9=>"亿",10=>"拾亿",11=>"佰亿",11=>"仟亿");[/php]
中后一个11应该改为12,楼主可能是笔误吧;
2、如楼上所说,数字应该尽量符合人们的习惯。比如输入1000,输出壹仟零佰零拾零元整,感觉有些别扭。

不过还是不错,顶一下原创

2006-6-19 08:41 php店小二
[quote][b]引用第4楼[i]coldney[/i]于[i]2006-06-17 23:08[/i]发表的“”[/b]:
嗯。还是有一些地方要修改的。
1、
[php]var $intNumBit     = array(1=>"元",2=>"拾",3=>"佰",4=>"仟",5=>"万",6=>"拾万",7=>"佰万",8=>"仟万",9=>"亿",10=>"拾亿",11=>"佰亿",11=>"仟亿");[/php]
中后一个11应该改为12,楼主可能是笔误吧;
2、如楼上所说,数字应该尽量符合人们的习惯。比如输入1000,输出壹仟零佰零拾零元整,感觉有些别扭。
.......[/quote]

谢谢,笔误!

我有时间会优化一下的!

谢谢!

2006-6-19 14:31 php店小二
[size=3]今天花了好大一会优化了一下
大家帮我测一下!
谢谢了![/size]

2006-6-19 14:51 coldney
嗯,现在比上次好多了。

1001000好像该读 壹佰万壹仟 吧?

2006-6-19 14:52 coldney
中间有没有读零?我也忘了

2006-6-19 15:11 php店小二
应该是有的!
谢谢了!
还有什么地方不足!还请指出来啊! [s:2]

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.