首页 > 开发 > PHP > 正文

php 把数字转换成汉字的代码

2024-05-04 23:37:58
字体:
来源:转载
供稿:网友

在一次面试中遇到一个有意思的小算法题:要求将阿拉伯数字转为汉字显示出来(包含单位)。当时虽然实现出来,但是代码写的有点凌乱。所以回家后,重新整理了一下。

直接上实例,写到 千亿上了。

 

 
  1. /** 
  2.  
  3. * @author ja颂  
  4. * 把数字1-1亿换成汉字表述,如:123->一百二十三 
  5. * @param [num] $num [数字] 
  6. * @return [string] [string] 
  7. */ 
  8. function numToWord($num) 
  9. $chiNum = array('零''一''二''三''四''五''六''七''八''九'); 
  10. $chiUni = array('','十''百''千''万''亿''十''百''千'); 
  11.  
  12. $chiStr = ''
  13.  
  14. $num_str = (string)$num; 
  15.  
  16. $count = strlen($num_str); 
  17. $last_flag = true//上一个 是否为0 
  18. $zero_flag = true//是否第一个 
  19. $temp_num = null//临时数字 
  20.  
  21. $chiStr = '';//拼接结果 
  22. if ($count == 2) {//两位数 
  23. $temp_num = $num_str[0]; 
  24. $chiStr = $temp_num == 1 ? $chiUni[1] : $chiNum[$temp_num].$chiUni[1]; 
  25. $temp_num = $num_str[1]; 
  26. $chiStr .= $temp_num == 0 ? '' : $chiNum[$temp_num];  
  27. }else if($count > 2){ 
  28. $index = 0; 
  29. for ($i=$count-1; $i >= 0 ; $i--) {  
  30. $temp_num = $num_str[$i]; 
  31. if ($temp_num == 0) { 
  32. if (!$zero_flag && !$last_flag ) { 
  33. $chiStr = $chiNum[$temp_num]. $chiStr; 
  34. $last_flag = true
  35. }else
  36. $chiStr = $chiNum[$temp_num].$chiUni[$index%9] .$chiStr; 
  37.  
  38. $zero_flag = false
  39. $last_flag = false
  40. $index ++; 
  41. }else
  42. $chiStr = $chiNum[$num_str[0]];  
  43. return $chiStr; 
  44.  
  45. $num = 150; 
  46. echo numToWord($num); 

方法二:

 

  1. <?php 
  2. /** 
  3. * 数字转换为中文 
  4. * @param string|integer|float $num 目标数字 
  5. * @param integer $mode 模式[true:金额(默认),false:普通数字表示] 
  6. * @param boolean $sim 使用小写(默认) 
  7. * @return string 
  8. */ 
  9. function number2chinese($num,$mode = true,$sim = true){ 
  10. if(!is_numeric($num)) return '含有非数字非小数点字符!'
  11. $char = $sim ? array('零','一','二','三','四','五','六','七','八','九'
  12. : array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); 
  13. $unit = $sim ? array('','十','百','千','','万','亿','兆'
  14. : array('','拾','佰','仟','','萬','億','兆'); 
  15. $retval = $mode ? '元':'点'
  16. //小数部分 
  17. if(strpos($num, '.')){ 
  18. list($num,$dec) = explode('.', $num); 
  19. $dec = strval(round($dec,2)); 
  20. if($mode){ 
  21. $retval .= "{$char[$dec['0']]}角{$char[$dec['1']]}分"
  22. }else
  23. for($i = 0,$c = strlen($dec);$i < $c;$i++) { 
  24. $retval .= $char[$dec[$i]]; 
  25. //整数部分 
  26. $str = $mode ? strrev(intval($num)) : strrev($num); 
  27. for($i = 0,$c = strlen($str);$i < $c;$i++) { 
  28. $out[$i] = $char[$str[$i]]; 
  29. if($mode){ 
  30. $out[$i] .= $str[$i] != '0'? $unit[$i%4] : ''
  31. if($i>1 and $str[$i]+$str[$i-1] == 0){ 
  32. $out[$i] = ''
  33. if($i%4 == 0){ 
  34. $out[$i] .= $unit[4+floor($i/4)]; 
  35. $retval = join('',array_reverse($out)) . $retval; 
  36. return $retval; 
  37. //实例调用===================================================== 
  38. $num = '0123648867.789'
  39. echo $num,'<br>'
  40. //普通数字的汉字表示 
  41. echo '普通:',number2chinese($num,false),''
  42. echo '<br>'
  43. //金额汉字表示 
  44. echo '金额(简体):',number2chinese($num,true),''
  45. echo '<br>'
  46. echo '金额(繁体):',number2chinese($num,true,false); 

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表