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 相关文章推荐
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
PHP获取文件夹大小函数用法实例
Jul 01 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
开启PHP的伪静态模式
Dec 31 PHP
Symfony2之session与cookie用法小结
Mar 18 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 PHP
php提供实现反射的方法和实例代码
Sep 17 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
PHP7 其他修改
Mar 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分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
跟老齐学Python之变量和参数
2014/10/10 Python
Python使用chardet判断字符编码
2015/05/09 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
python处理数据,存进hive表的方法
2018/07/04 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
惠普香港官方商店:HP香港
2019/04/30 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
机电一体化毕业生自荐信
2014/06/19 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
平面设计师岗位职责
2014/09/18 职场文书
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android