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

作者:袖梨 2022-06-24

例子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这样的数字转大写之后是"壹仟玖佰陆拾元叁角",而有的系统则要求"壹仟玖佰陆拾元零叁角",这两种情况按"正确填写票据和结算凭证的基本规定"都是正确的,现在可已自定义。

代码如下 复制代码

/**
* 人民币小写转大写
*
* @param string $number 数值
* @param string $int_unit 币种单位,默认"元",有的需求可能为"圆"
* @param bool $is_round 是否对小数进行四舍五入
* @param bool $is_extra_zero 是否对整数部分以0结尾,小数存在的数字附加0,比如1960.30,
* 有的系统要求输出"壹仟玖佰陆拾元零叁角",实际上"壹仟玖佰陆拾元叁角"也是对的
* @return string
* @site www.111com.net */
function num2rmb($number = 0, $int_unit = '元', $is_round = TRUE, $is_extra_zero = FALSE)
{
// 将数字切分成两段
$parts = explode('.', $number, 2);
$int = isset($parts[0]) ? strval($parts[0]) : '0';
$dec = isset($parts[1]) ? strval($parts[1]) : '';

// 如果小数点后多于2位,不四舍五入就直接截,否则就处理
$dec_len = strlen($dec);
if (isset($parts[1]) && $dec_len > 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

相关文章

精彩推荐