php将数值转换文字输出。列:12345678 -> 一千二百三十四万五千六百七十八

php将数值转换文字输出(转自公司大佬!!!非常感谢!!!)

直接上代码:

<?php
function getNumberCh($num)
{
if (!is_int($num)) {
return '';
}
if ($num >= 1000000000 || $num < 0) {
return '';
}
$NUMBER_CH = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
$COL_CH = ['', '十', '百', '千', '万', '十', '百', '千', '亿'];	
$result = '';
$numstr = strval($num);
for ($j = 0; $j < strlen($numstr); $j++) {
if (intval($numstr[$j]) > 0) {
$result .= $NUMBER_CH[intval($numstr[$j])];
$result .= $COL_CH[strlen($numstr) - $j - 1];
} elseif ((strlen($numstr) - $j == 5) || (strlen($numstr) - $j == 9)) {
if (strrpos($result, $COL_CH[8]) != strlen($result) - strlen($COL_CH[8])) {
$result .= $COL_CH[strlen($numstr) - $j - 1];
}
} elseif (strrpos($result, $NUMBER_CH[0]) != strlen($result) - strlen($NUMBER_CH[0])) {
if (!empty($numstr[$j + 1])) {
$result .= $NUMBER_CH[0];
}
}
}
return $result;
}

echo getNumberCh(12345678);//这里的数值就是你要转换的值

上面代码输出就是:一千二百三十四万五千六百七十八

如果你想输出类似发票的大写文字,你只需替换这里的文字即可,下面是替换后的代码:

$NUMBER_CH = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾'];
$COL_CH = ['', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '亿'];	

以上方法只能输出10亿以内的数字

下面的方法可以输出元角分的,并且数字可以到千兆的,一起来看一下吧!

<?php
function number2chinese($num,$mode = true,$sim = true){
if(!is_numeric($num)) return '含有非数字非小数点字符!';
$char = $sim ? array('零','一','二','三','四','五','六','七','八','九')
: array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
$unit = $sim ? array('','十','百','千','','万','亿','兆')
: array('','拾','佰','仟','','萬','億','兆');
$retval = $mode ? '元':'点';
//小数部分
if(strpos($num, '.')){
if($mode){
$dec = explode('.', $num);
$dec = str_split($dec[1]);
if($mode){
if(count($dec)>1){
if($dec['0']!='0' && $dec['1']!='0' && $dec['1']!=null){
$retval .= "{$char[$dec['0']]}{$char[$dec['1']]}分";
}elseif($dec['0']!='0' && $dec['1']=='0'){
$retval .= "{$char[$dec['0']]}角";
}elseif($dec['0']=='0' && $dec['1']!='0' && $dec['1']!=null){
$retval .= "{$char[$dec['1']]}分";
}
}else{
$retval .= "{$char[$dec['0']]}角";
}
}else{
for($i = 0,$c = strlen($dec);$i < $c;$i++) {
$retval .= $char[$dec[$i]];
}
}
}
}

//整数部分
$str = $mode ? strrev(intval($num)) : strrev($num);
for($i = 0,$c = strlen($str);$i < $c;$i++) {
$out[$i] = $char[$str[$i]];
if($mode){
$out[$i] .= $str[$i] != '0'? $unit[$i%4] : '';
if($i>1 and $str[$i]+$str[$i-1] == 0){
$out[$i] = '';
}
if($i%4 == 0){
$out[$i] .= $unit[4+floor($i/4)];
}
}
}
$retval = join('',array_reverse($out)) . $retval;
return $retval;
}

$num = '12345678901234.050';
//普通数字的汉字表示
echo '普通:',number2chinese($num,false),'';
echo '<br>';
 //金额汉字表示
echo '金额(简体):',number2chinese($num,true),'';
echo '<br>';
echo '金额(繁体):',number2chinese($num,true,false);
?>

我在第二种方法上做了一些修正。之前输出是这样的,比如:如果数字是1.02,正常输出应该是壹元二分,但是程序却输出壹元贰角分,所以就有点问题了。现在修正后就正常了。

第二种方法转载于php中文网

如果各位大佬有更好的方法,或者哪里书写有误,请联系本人,感谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值