站长论坛

标题: [php] 数字金额 转 大写金额 [打印本页]

作者: tzlink    时间: 2007-9-30 14:04
标题: [php] 数字金额 转 大写金额
<?php
/**
* @file
* @version 1.0
* @author   网海浪子
* @date 2006-6-16
* @email sxf02615@163.com
* @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);
?>




欢迎光临 站长论坛 (http://tzlink.com/bbs/) Powered by Discuz! X3.2