喜悦国际村 » 代码共享 » 共享:数字转换为中文的类

页: [1]
ysoo2004-5-25 01:25 PM
共享:数字转换为中文的类

<?
class ChineseNumber
{
var $basical=array(0=>"零","一","二","三","四","五","六","七","八","九");
//var $basical=array(0=>"零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
var $advanced=array(1=>"十","百","千");
//var $advanced=array(1=>"拾","佰","仟");
var $top=array(1=>"万","亿");

var $level; // 以4位为一级

// 先实现万一下的数的转换
function ParseNumber($number)
{
if ($number>999999999999) // 只能处理到千亿。
return "数字太大,无法处理。抱歉!";
if ($number==0)
return "零";

for($this->level=0;$number>0.0001;$this->level++,$number=floor($number / 10000))
{
// 对于中文来说,应该是4位为一组。
// 四个变量分别对应 个、十、百、千 位。
$n1=substr($number,-1,1);
if($number>9)
$n2=substr($number,-2,1);
else
$n2=0;
if($number>99)
$n3=substr($number,-3,1);
else
$n3=0;
if($number>999)
$n4=substr($number,-4,1);
else
$n4=0;

if($n4)
$parsed[$this->level].=$this->basical[$n4].$this->advanced[3];
else
if(($number/10000)>=1) // 千位为0,数值大于9999的情况
$parsed[$this->level].="零";
if($n3)
$parsed[$this->level].=$this->basical[$n3].$this->advanced[2];
else
if(!ereg("零$",$parsed[$this->level]) && ($number / 1000)>=1) // 不出现连续两个“零”的情况
$parsed[$this->level].="零";
if($n2)
$parsed[$this->level].=$this->basical[$n2].$this->advanced[1];
else
if(!ereg("零$",$parsed[$this->level]) && ($number / 100)>=1) // 不出现连续两个“零”的情况
$parsed[$this->level].="零";
if($n1)
$parsed[$this->level].=$this->basical[$n1];
}
for($this->level-=1;$this->level>=0;$this->level--)
{
$result.=$parsed[$this->level].$this->top[$this->level];
}

if(ereg("零$",$result))
$result=substr($result,0,strlen($result)-2);

return $result;

}
};

$c=new ChineseNumber();
echo $c->ParseNumber(123456789012);

?>

wild-dog2004-5-25 01:35 PM
不错,适合做会计的用。

xiaocon2004-5-25 02:06 PM
$c=new ChineseNumber();
echo $c->ParseNumber(900006.30);

输出:
九十万零六百十三

jxxysong2004-5-25 02:07 PM
实用类!呵呵,顶!

lfireboy2004-5-25 02:09 PM
[b]$c=new ChineseNumber();
echo $c->ParseNumber(900006.30);
输出:
九十万零六百十三[/b]

呵呵~~
类似代码好像见过

xiaocon2004-5-25 02:11 PM
没发现有错误吗?

jxxysong2004-5-25 02:12 PM
[QUOTE][i]最初由 xiaocon 发布[/i]
[B]$c=new ChineseNumber();
echo $c->ParseNumber(900006.30);

输出:
九十万零六百十三 [/B][/QUOTE]

这个类好象只能用于整数型,实型的数据处理不了!

lqy7302004-5-25 02:19 PM
路过

s_seraph2004-5-25 03:08 PM
小问题,应该不难解决

ysoo2004-5-25 03:36 PM
请高手改进此类

s_seraph2004-5-25 04:38 PM
处理整数部分挺不错的,偶看了半天,看得头晕,不看了:D

[PHP]
class ChineseNumber        {
var $basical=array(0=>"零","一","二","三","四","五","六","七","八","九");
//var $basical=array(0=>"零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
var $advanced=array(1=>"十","百","千");
//var $advanced=array(1=>"拾","佰","仟");
var $top=array(1=>"万","亿");
var $level; // 以4位为一级
// 先实现万一下的数的转换
function ParseNumber($number) {//接收字串
        $number_len=strlen($number);//取得字串总长
        $number=floatval($number);//转成float型
        $number_f_len=strlen(strval(floor($number)));//取得小数点前长度
        $number_b_len=$number_len-$number_f_len-1;//取得小数点后长度

        if ($number>999999999999) // 只能处理到千亿
                return "数字太大,无法处理。抱歉!";
        if ($number==0)
                return "零";

//处理小数点后
        $s=round($number-floor($number),$number_b_len);//取得小数部分值
        $s=substr(strval($s),2,$number_b_len);
        $s_result="";
        for ($i=0;$i<strlen($s);$i++)        {
                $j=intval(substr($s,$i,1));
                $s_result.=$this->basical[$j];
        }

//处理小数点前       
        for($this->level=0;$number>0.0001;$this->level++,$number=floor($number / 10000))        {
                // 对于中文来说,应该是4位为一组。
                // 四个变量分别对应 个、十、百、千 位。
                $n1=substr($number,-1,1);
                if($number>9)
                        $n2=substr($number,-2,1);
                else
                        $n2=0;
                if($number>99)
                        $n3=substr($number,-3,1);
                else
                        $n3=0;
                if($number>999)
                        $n4=substr($number,-4,1);
                else
                        $n4=0;
               
                if($n4)
                        $parsed[$this->level].=$this->basical[$n4].$this->advanced[3];
                else
                        if(($number/10000)>=1) // 千位为0,数值大于9999的情况
                                $parsed[$this->level].="零";
                if($n3)
                        $parsed[$this->level].=$this->basical[$n3].$this->advanced[2];
                else
                        if(!ereg("零$",$parsed[$this->level]) && ($number / 1000)>=1) // 不出现连续两个“零”的情况
                                $parsed[$this->level].="零";
                if($n2)
                        $parsed[$this->level].=$this->basical[$n2].$this->advanced[1];
                else
                        if(!ereg("零$",$parsed[$this->level]) && ($number / 100)>=1) // 不出现连续两个“零”的情况
                                $parsed[$this->level].="零";
                if($n1)
                        $parsed[$this->level].=$this->basical[$n1];
        }
        for($this->level-=1;$this->level>=0;$this->level--)        {
                $result.=$parsed[$this->level].$this->top[$this->level];
        }
        if(ereg("零$",$result))
                $result=substr($result,0,strlen($result)-2);
       
//返回       
        return $result."点".$s_result;
}
};

echo $n="123456789012.2345";
$c=new ChineseNumber();
$n=$c->ParseNumber($n);
echo "<br>";
echo $n;
[/PHP]

结果:
123456789012.1234
一千二百三十四亿五千六百七十八万九千零一十二点一二三四


查看完整版本: 共享:数字转换为中文的类


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.006388 second(s), 2 queries