站长论坛
标题:
[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