我们常用做商城时会希望把用户输入的数字转换在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