您好,欢迎访问一九零五行业门户网

php把金钱数字转为大写的函数

我们常用做商城时会希望把用户输入的数字转换在rmb大写形式了,下面我整理了几个可以处理万亿级的数字转换例子,大家一起来看看这些例子吧。
例子1
 代码如下 复制代码
function change_num($num)
 {
 $d = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
 $e = array('元','拾','佰','仟','万','拾万','佰万','仟万','亿','拾亿','佰亿','仟亿','万亿');
 $p = array('分','角');
 $zheng='整'; //追加整字
 $final = array(); //结果
 $inwan=0; //是否有万
 $inyi=0; //是否有亿
 $len_pointdigit=0; //小数点后长度
 $y=0;
 if($c = strpos($num, '.')) //有小数点,$c为小数点前有几位数
 {
 $len_pointdigit = strlen($num)-strpos($num, '.')-1; // 判断小数点后有几位数
 if($c>13) //简单的错误处理
 {
 echo 数额太大,已经超出万亿.;
 die();
 }
 elseif($len_pointdigit>2) //$len_pointdigit小数点后有几位
 {
 echo 小数点后只支持2位.;
 die();
 }
 }
 else //无小数点
 {
 $c = strlen($num);
 $zheng = '整';
 }
 for($i=0;$i {
 $bit_num = substr($num, $i, 1); //逐字读取 左->右
 if($bit_num!=0 || substr($num, $i+1, 1)!=0) //当前是零 下一位还是零的话 就不显示
 @$low2chinses = $low2chinses.$d[$bit_num];
 if($bit_num || $i==$c-1)
 @$low2chinses = $low2chinses.$e[$c-$i-1];
 }
 for($j=$len_pointdigit; $j>=1; $j--) //处理小数部分
 {
 $point_num = substr($num, strlen($num)-$j, 1); //逐字读取 左->右
 if($point_num != 0)
 @$low2chinses = $low2chinses.$d[$point_num].$p[$j-1];
 //if(substr($num, strlen($num)-2, 1)==0 && substr($num, strlen($num)-1, 1)==0) //小数点后两位都是0
 }
 $chinses = str_split($low2chinses,2); //字符串转换成数组
 //print_r($chinses);
 for($x=sizeof($chinses)-1;$x>=0;$x--) //过滤无效的信息
 {
 if($inwan==0&&$chinses[$x]==$e[4]) //过滤重复的万
 {
 $final[$y++] = $chinses[$x];
 $inwan=1;
 }
 if($inyi==0&&$chinses[$x]==$e[8]) //过滤重复的亿
 {
 $final[$y++] = $chinses[$x];
 $inyi=1;
 $inwan=0;
 }
 if($chinses[$x]!=$e[4]&&$chinses[$x]!=$e[8]) //进行整理,将最后的值赋予$final数组
 $final[$y++] = $chinses[$x];
 }
 $newstring=(array_reverse($final)); //$final为倒数组,$newstring为正常可以使用的数组
 $nstring=join($newstring); //数组变成字符串
 if(substr($num,-2,1)==0 && substr($num,-1)0) //判断原金额角位为0 ? 分位不为0 ?
 {
 $nstring=substr($nstring,0,(strlen($nstring)-4)).零.substr($nstring,-4,4); //这样加一个零字
 }
 $fen=分;
 $fj=substr_count($nstring, $fen); //如果没有查到分这个字
 return $nstring=($fj==0)?$nstring.$zheng:$nstring; //就将整加到后面
 }
例子2
 1.支持天文数字,整数位理论上可以无限的长;
    2.支持小数,对于货币,一般精确到小数后两位,可以设置小数位是否四舍五入;
    3.支持自定义货币单位,有的系统要求大写是圆,有的要求是元,可以自定义;
    4.支持整数以0结束并含有小数的数字自定义末尾补零,比如有的系统要求1960.30这样的数字转大写之后是壹仟玖佰陆拾元叁角,而有的系统则要求壹仟玖佰陆拾元零叁角,这两种情况按正确填写票据和结算凭证的基本规定都是正确的,现在可已自定义。
代码如下 复制代码
  2)
        {
            $dec = $is_round
                    ? substr(strrchr(strval(round(floatval(0..$dec), 2)), '.'), 1)
                    : substr($parts[1], 0, 2);
        }
        // 当number为0.001时,小数点后的金额为0元
        if(empty($int) && empty($dec))
        {
            return '零';
        }
        // 定义
        $chs = array('0','壹','贰','叁','肆','伍','陆','柒','捌','玖');
        $uni = array('','拾','佰','仟');
        $dec_uni = array('角', '分');
        $exp = array('', '万');
        $res = '';
        // 整数部分从右向左找
        for($i = strlen($int) - 1, $k = 0; $i >= 0; $k++)
        {
            $str = '';
            // 按照中文读写习惯,每4个字为一段进行转化,i一直在减
            for($j = 0; $j = 0; $j++, $i--)
            {
                $u = $int{$i} > 0 ? $uni[$j] : ''; // 非0的数字后面添加单位
                $str = $chs[$int{$i}] . $u . $str;
            }
            //echo $str.|.($k - 2).
;
            $str = rtrim($str, '0');// 去掉末尾的0
            $str = preg_replace(/0+/, 零, $str); // 替换多个连续的0
            if(!isset($exp[$k]))
            {
                $exp[$k] = $exp[$k - 2] . '亿'; // 构建单位
            }
            $u2 = $str != '' ? $exp[$k] : '';
            $res = $str . $u2 . $res;
        }
        // 如果小数部分处理完之后是00,需要处理下
        $dec = rtrim($dec, '0');
        // 小数部分从左向右找
        if(!empty($dec))
        {
            $res .= $int_unit;
            // 是否要在整数部分以0结尾的数字后附加0,有的系统有这要求
            if ($is_extra_zero)
            {
                if (substr($int, -1) === '0')
                {
                    $res.= '零';
                }
            }
            for($i = 0, $cnt = strlen($dec); $i             {
                $u = $dec{$i} > 0 ? $dec_uni[$i] : ''; // 非0的数字后面添加单位
                $res .= $chs[$dec{$i}] . $u;
            }
            $res = rtrim($res, '0');// 去掉末尾的0
            $res = preg_replace(/0+/, 零, $res); // 替换多个连续的0
        }
        else
        {
            $res .= $int_unit . '整';
        }
        return $res;
    }
    echo
;
    $number = 1000000000000000012345678900.501;
    echo $number.:.num2rmb($number);
    echo n;
    $number = 1960.30;
    echo $number.:.num2rmb($number);
    echo n;
    $number = 1960.30;
    echo $number.:.num2rmb($number, 圆, true, true);
    echo n;
    $number = 123456789.005;
    echo $number.:.num2rmb($number);
    echo n;
    $number = 123456789.005;
    echo $number.:.num2rmb($number, 元, false);
    echo n;
    $number = 10000000000000000060009.101;
    echo $number.:.num2rmb($number);
    echo n;
    $number = 1680.32;
    echo $number.:.num2rmb($number);
?>
例子3
看上面的个人更喜欢下面这个
 代码如下 复制代码
//把数字金额转换成中文大写数字的函数
function num2rmb ($num){
 $c1=零壹贰叁肆伍陆柒捌玖;
 $c2=分角元拾佰仟万拾佰仟亿;
 $num=round($num,2);
 $num=$num*100;
 $newnum = ceil($num);
 if(strlen($newnum)>10){
 return 金额太大;
 }
 $i=0;
 $c=;
 while (1){
 if($i==0){
 $n=substr($num,strlen($num)-1,1);
 }else{
 $n=$num %10;
 }
 $p1=substr($c1,2*$n,2);
 $p2=substr($c2,2*$i,2);
 if($n!='0' || ($n=='0' &&($p2=='亿' || $p2=='万' || $p2=='元' ))){
 $c=$p1.$p2.$c;
 }else{
 $c=$p1.$c;
 }
 $i=$i+1;
 $num=$num/10;
 $num=(int)$num;
 if($num==0){
 break;
 }
 }//end of while| here, we got a chinese string with some useless character
 //we chop out the useless characters to form the correct output
 $j = 0;
 $slen=strlen($c);
 while ($j $m = substr($c,$j,4);
 if ($m=='零元' || $m=='零万' || $m=='零亿' || $m=='零零'){
 $left=substr($c,0,$j);
 $right=substr($c,$j+2);
 $c = $left.$right;
 $j = $j-2;
 $slen = $slen-2;
 }
 $j=$j+2;
 }
 if(substr($c,strlen($c)-2,2)=='零'){
 $c=substr($c,0,strlen($c)-2);
 } // if there is a '0' on the end , chop it out
 return $c;
}// end of function
其它类似信息

推荐信息