
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.