php封装好的人民币数值转中文大写类


Posted in PHP onDecember 20, 2015

php封装好的人民币数值转中文大写类

class Num2RmbClass{
  /**
   * 人民币数值转中文大写
   * @author SunsCheung
   * @time 2015.11.11
   * @param string $number 数值 默认为0
   * @param string $int_unit 币种单位,默认"元",有的需求可能为"圆"
   * @param bool $is_round 是否对小数进行四舍五入
   * @param bool $is_extra_zero 是否对整数部分以0结尾,小数存在的数字附加0,比如1960.30,
   *       有的系统要求输出"壹仟玖佰陆拾元零叁角",实际上"壹仟玖佰陆拾元叁角"也是对的
   * @param bool $dec_to_int 是否对让小数部分进位到个位,如果进位,个位加1,小数为0,
   * @return string
   */
  public static function num2rmb($number = 0, $int_unit = '元', $is_round = TRUE, $is_extra_zero = FALSE, $dec_to_int = 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) {
      if($is_round){
        if(round(floatval("0.".$dec), 2) == 1 && $dec_to_int){//小数进位到个位
          $int = empty($int)?1: strval($parts[0]+1);
          $dec = 0;
        }elseif(round(floatval("0.".$dec), 2) == 1){//小数不进位到个位
          $dec = "99";
        }else{
          $dec = substr(strrchr(strval(round(floatval("0.".$dec), 2)), '.'), 1);
          echo $dec;die('boss');
        }
      }else{
        $dec = 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 < 4 && $i >= 0; $j++, $i--) {
        $u = $int{$i} > 0 ? $uni[$j] : ''; // 非0的数字后面添加单位
        $str = $chs[$int{$i}] . $u . $str;
      }
      //echo $str."|".($k - 2)."<br>";
      $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 < $cnt; $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 $number < 0 ? "(负)".$res : $res;
  }

}

使用方法

//$a = new Num2RmbClass;
echo (Num2RmbClass::num2rmb('1600020039.9989','圆',false,false,false));

再给大家分享一个简单点的

function cny($ns) 
{
static $cnums = array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"), 
$cnyunits = array("圆","角","分"), 
$grees = array("拾","佰","仟","万","拾","佰","仟","亿"); 
list($ns1,$ns2) = explode(".",$ns,2); 
$ns2 = array_filter(array($ns2[1],$ns2[0])); 
$ret = array_merge($ns2,array(implode("", _cny_map_unit(str_split($ns1), $grees)), "")); 
$ret = implode("",array_reverse(_cny_map_unit($ret,$cnyunits))); 
return str_replace(array_keys($cnums), $cnums,$ret); 
}

function _cny_map_unit($list,$units) 
{ 
$ul = count($units); 
$xs = array(); 
foreach (array_reverse($list) as $x) 
{ 
$l = count($xs); 
if($x!="0" || !($l%4)) 
{
$n=($x=='0'?'':$x).($units[($l-1)%$ul]); 
}
else
{
$n=is_numeric($xs[0][0]) ? $x : ''; 
}
array_unshift($xs, $n); 
} 
return $xs; 
}

$value='23058.04';
print cny($value);echo'
';

输出:贰万叁仟零伍拾捌圆肆角

再来一个网友做好的也很不错

/**
*数字金额转换成中文大写金额的函数
*String Int $num 要转换的小写数字或小写字符串
*return 大写字母
*小数位为两位
**/
function num_to_rmb($num){
    $c1 = "零壹贰叁肆伍陆柒捌玖";
    $c2 = "分角元拾佰仟万拾佰仟亿";
    //精确到分后面就不要了,所以只留两个小数位
    $num = round($num, 2); 
    //将数字转化为整数
    $num = $num * 100;
    if (strlen($num) > 10) {
        return "金额太大,请检查";
    } 
    $i = 0;
    $c = "";
    while (1) {
        if ($i == 0) {
            //获取最后一位数字
            $n = substr($num, strlen($num)-1, 1);
        } else {
            $n = $num % 10;
        }
        //每次将最后一位数字转化为中文
        $p1 = substr($c1, 3 * $n, 3);
        $p2 = substr($c2, 3 * $i, 3);
        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;
        } 
    }
    $j = 0;
    $slen = strlen($c);
    while ($j < $slen) {
        //utf8一个汉字相当3个字符
        $m = substr($c, $j, 6);
        //处理数字中很多0的情况,每次循环去掉一个汉字“零”
        if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
            $left = substr($c, 0, $j);
            $right = substr($c, $j + 3);
            $c = $left . $right;
            $j = $j-3;
            $slen = $slen-3;
        } 
        $j = $j + 3;
    } 
    //这个是为了去掉类似23.0中最后一个“零”字
    if (substr($c, strlen($c)-3, 3) == '零') {
        $c = substr($c, 0, strlen($c)-3);
    }
    //将处理的汉字加上“整”
    if (empty($c)) {
        return "零元整";
    }else{
        return $c . "整";
    }
}
echo num_to_rmb(23000000.00); //贰仟叁佰万元整
PHP 相关文章推荐
PHP+MYSQL 出现乱码的解决方法
Aug 08 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 PHP
php远程下载类分享
Apr 13 PHP
PHP判断密码强度的方法详解
May 26 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 #PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 #PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 #PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 #PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 #PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 #PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 #PHP
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP Cookie学习笔记
2016/08/23 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
详解python单例模式与metaclass
2016/01/15 Python
Python中的Descriptor描述符学习教程
2016/06/02 Python
利用python获取Ping结果示例代码
2017/07/06 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
Delphi工程师笔试题
2013/09/21 面试题
1亿有多大教学反思
2014/05/01 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
国庆促销活动总结
2014/08/29 职场文书
工作调动申请报告
2015/05/18 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
mysqldump进行数据备份详解
2022/07/15 MySQL