<?php
/****************************** 相关说明 ***************************
函数功能: 人民币小写=>大写转换.
测试环境: Win2K svr, Apache 2.0.47, php 4.3.3 .
参    数: 0.01 <= $rmb <= 9999999999999.99,小数点后保留两位有效位,
          超过两位按四舍五入计.参数可以是 int,float 或 string 类型.
 E-mail : [email protected]
*******************************************************************/
function rmb_convert($rmb)
{
  if(!empty($rmb)&&is_numeric($rmb)
     &&strlen($rmb_tmp=sprintf("%01.2f",$rmb))<=16)
  {
    $conv_tb=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"
                  ,"i"=>"亿","w"=>"万","q"=>"仟","b"=>"佰","s"=>"拾"
                  ,"y"=>"元","j"=>"角","f"=>"分","z"=>"整");
    list($rmb_zs,$rmb_xs)=explode('.',$rmb_tmp);
    $tmp=sprintf("%015s",$rmb_zs.$rmb_xs);
    $str_tmp=$tmp[0]."w"
            .$tmp[1]."q".$tmp[2]."b".$tmp[3]."s".$tmp[4]."i"
            .$tmp[5]."q".$tmp[6]."b".$tmp[7]."s".$tmp[8]."w"
            .$tmp[9]."q".$tmp[10]."b".$tmp[11]."s".$tmp[12]."y"
            .$tmp[13]."j".$tmp[14]."f";
    $rslt_tmp="";
    for($str_pos=0;$str_pos<=strlen($str_tmp);$str_pos++)
    {
      if(is_numeric($str_tmp[$str_pos]))
      {
        if($str_tmp[$str_pos]!=0)
          $rslt_tmp.=$str_tmp[$str_pos].$str_tmp[$str_pos+1];
        else
        {
          if(!empty($rslt_tmp))
          {
            if($str_tmp[$str_pos+1]=='i'||$str_tmp[$str_pos+1]=='w'||
               $str_tmp[$str_pos+1]=='y')
              $rslt_tmp.=$str_tmp[$str_pos+1];
            elseif($str_tmp[$str_pos+2]!=0)
              $rslt_tmp.="0";
          }
        }
      }
    }
    if(!empty($rslt_tmp))
      $rslt_tmp.='z';
    else
      echo "参数错误!";
    $rslt="";
    for($pos=0;$pos<=strlen($rslt_tmp);$pos++)
    {
      $rslt.=$conv_tb[$rslt_tmp[$pos]];
    }
    return $rslt;
  }
  else
  {
    echo "参数错误!";
  }
}echo rmb_convert(9999999999999.99);
//玖万玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元玖角玖分整echo rmb_convert(09999999999999);
//参数错误!echo rmb_convert(9999999999999);
//玖万玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元整echo rmb_convert(9999999999999.999);
//参数错误!echo rmb_convert(0.0049);
//参数错误!echo rmb_convert(.0051);
//壹分整echo rmb_convert("70909060807.01");
//柒佰零玖亿零玖佰零陆万零捌佰零柒元零壹分整echo rmb_convert("70909060-807.01");
//参数错误!
?>

解决方案 »

  1.   

    echo rmb_convert("70000000007.01");
    //输出 柒佰亿万零柒元零壹分整
    应该输出:
    柒佰亿零柒元零壹分整

    柒佰亿柒元零壹分整
      

  2.   

    感谢 xuzuning(唠叨)
    现修改如下:<?php
    function rmb_convert($rmb)
    {
      if(!empty($rmb)&&is_numeric($rmb)
         &&strlen($rmb_tmp=sprintf("%01.2f",$rmb))<=16)
      {
        $conv_tb=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"
                      ,"i"=>"亿","w"=>"万","q"=>"仟","b"=>"佰","s"=>"拾"
                      ,"y"=>"元","j"=>"角","f"=>"分","z"=>"整");
        list($rmb_zs,$rmb_xs)=explode('.',$rmb_tmp);
        $tmp=sprintf("%015s",$rmb_zs.$rmb_xs);
        $str_tmp=$tmp[0]."w"
                .$tmp[1]."q".$tmp[2]."b".$tmp[3]."s".$tmp[4]."i"
                .$tmp[5]."q".$tmp[6]."b".$tmp[7]."s".$tmp[8]."w"
                .$tmp[9]."q".$tmp[10]."b".$tmp[11]."s".$tmp[12]."y"
                .$tmp[13]."j".$tmp[14]."f";
        $rslt_tmp="";
        for($str_pos=0;$str_pos<=strlen($str_tmp);$str_pos++)
        {
          if(is_numeric($str_tmp[$str_pos]))
          {
            if($str_tmp[$str_pos]!=0)
              $rslt_tmp.=$str_tmp[$str_pos].$str_tmp[$str_pos+1];
            else
            {
              if(!empty($rslt_tmp))
              {
                if(($str_tmp[$str_pos+1]=='i'||$str_tmp[$str_pos+1]=='w'||
                   $str_tmp[$str_pos+1]=='y')
                   &&$rslt_tmp[strlen($rslt_tmp)-1]!='i')
                  $rslt_tmp.=$str_tmp[$str_pos+1];
                elseif($str_tmp[$str_pos+2]!=0)
                  $rslt_tmp.="0";
              }
            }
          }
        }
        if(!empty($rslt_tmp))
          $rslt_tmp.='z';
        else
          echo "参数错误!";
        $rslt="";
        for($pos=0;$pos<=strlen($rslt_tmp);$pos++)
        {
          $rslt.=$conv_tb[$rslt_tmp[$pos]];
        }
        return $rslt;
      }
      else
      {
        echo "参数错误!";
      }
    }echo rmb_convert(9999999999999.99);
    //玖万玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元玖角玖分整echo rmb_convert(09999999999999);
    //参数错误!echo rmb_convert(9999999999999);
    //玖万玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元整echo rmb_convert(9999999999999.999);
    //参数错误!echo rmb_convert(0.0049);
    //参数错误!echo rmb_convert(.0051);
    //壹分整echo rmb_convert("70909060807.01");
    //柒佰零玖亿零玖佰零陆万零捌佰零柒元零壹分整echo rmb_convert("70909060-807.01");
    //参数错误!echo rmb_convert(7000000000007.01);
    //柒万亿零柒元零壹分整
    ?>
      

  3.   

    整数部分精确到14位就有问题了,小数部分的最后一位会有偏差,如12345678901234.99会变成
    12345678901234.98了,不知道是不是跟php.ini中的 precision 设置有关,请各路高手赐教...