php将金额数字转化为中文大写


Posted in PHP onJuly 09, 2015

php将金额数字转化为中文大写

echo toChineseNumber(1234567890);//壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾圆
function toChineseNumber($money){
  $money = round($money,2);
  $cnynums = array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"); 
  $cnyunits = array("圆","角","分");
  $cnygrees = array("拾","佰","仟","万","拾","佰","仟","亿"); 
  list($int,$dec) = explode(".",$money,2);
  $dec = array_filter(array($dec[1],$dec[0])); 
  $ret = array_merge($dec,array(implode("",cnyMapUnit(str_split($int),$cnygrees)),"")); 
  $ret = implode("",array_reverse(cnyMapUnit($ret,$cnyunits))); 
  return str_replace(array_keys($cnynums),$cnynums,$ret); 
}
function cnyMapUnit($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; 
 }

代码二:

/**
*数字金额转换成中文大写金额的函数
*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
//先贴一个数字转中文的,最多12位数 
function convert_2_cn($num) {
$convert_cn = array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
$repair_number = array('零仟零佰零拾零','万万','零仟','零佰','零拾');
$unit_cn = array("拾","佰","仟","万","亿");
$exp_cn = array("","万","亿");
$max_len = 12;

$len = strlen($num);
if($len > $max_len) {
return 'outnumber';
}
$num = str_pad($num,12,'-',STR_PAD_LEFT);
$exp_num = array();
$k = 0;
for($i=12;$i>0;$i--){
if($i%4 == 0) {
$k++;
}
$exp_num[$k][] = substr($num,$i-1,1);
}
$str = '';
foreach($exp_num as $key=>$nums) {
if(array_sum($nums)){
$str = array_shift($exp_cn) . $str;
}
foreach($nums as $nk=>$nv) {
if($nv == '-'){continue;}
if($nk == 0) {
$str = $convert_cn[$nv] . $str;
} else {
$str = $convert_cn[$nv].$unit_cn[$nk-1] . $str;
}
}
}
$str = str_replace($repair_number,array('万','亿','-'),$str);
$str = preg_replace("/-{2,}/","",$str);
$str = str_replace(array('零','-'),array('','零'),$str);
return $str;
}
echo convert_2_cn(1111)."\n";
echo convert_2_cn(111111)."\n";
echo convert_2_cn(111111111111)."\n";

//补充一个中文转数字的
function cn_2_num($str){
$convert_cn = array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
$skip_words = array("拾","佰","仟");
$str = str_replace($skip_words,"",$str);
$len = mb_strlen($str,'utf-8');
$num = 0;
$k = '';
for($i=0;$i<$len;$i++) {
$cn = mb_substr($str,$i,1,'utf-8');
if($cn == '亿') {
$num = $num + intval($k)*100000000;
$k = '';
} elseif($cn == '万') {
$num = $num + intval($k)*10000;
$k = '';
} else {
$k = $k . array_search($cn,$convert_cn);
}
}
if($k) {
$num = $num + intval($k);
}    
return $num;                                                            
}                                                                   
echo cn_2_num('壹仟壹佰壹拾壹亿壹仟壹佰壹拾壹万壹仟壹佰壹拾壹')."\n";                                 
echo cn_2_num('拾壹万壹仟壹佰壹拾壹')."\n";  
?>

代码四:

function convertCurrency(currencyDigits) {
// Constants:
var MAXIMUM_NUMBER = 99999999999.99;
// Predefine the radix characters and currency symbols for output:
var CN_ZERO = "零";
var CN_ONE = "壹";
var CN_TWO = "贰";
var CN_THREE = "叁";
var CN_FOUR = "肆";
var CN_FIVE = "伍";
var CN_SIX = "陆";
var CN_SEVEN = "柒";
var CN_EIGHT = "捌";
var CN_NINE = "玖";
var CN_TEN = "拾";
var CN_HUNDRED = "佰";
var CN_THOUSAND = "仟";
var CN_TEN_THOUSAND = "万";
var CN_HUNDRED_MILLION = "亿";
var CN_SYMBOL = "人民币";
var CN_DOLLAR = "元";
var CN_TEN_CENT = "角";
var CN_CENT = "分";
var CN_INTEGER = "整";
// Variables:
var integral; // Represent integral part of digit number. 
var decimal; // Represent decimal part of digit number.
var outputCharacters; // The output result.
var parts;
var digits, radices, bigRadices, decimals;
var zeroCount;
var i, p, d;
var quotient, modulus;
// Validate input string:
currencyDigits = currencyDigits.toString();
if (currencyDigits == "") {
 alert("Empty input!");
 return "";
}
if (currencyDigits.match(/[^,.\d]/) != null) {
 alert("Invalid characters in the input string!");
 return "";
}
if ((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) == null) {
 alert("Illegal format of digit number!");
 return "";
}
// Normalize the format of input digits:
currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.
currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning. 
// Assert the number is not greater than the maximum number.
if (Number(currencyDigits) > MAXIMUM_NUMBER) {
 alert("Too large a number to convert!");
 return "";
}
// http://www.knowsky.com/ Process the coversion from currency digits to characters:
// Separate integral and decimal parts before processing coversion:
parts = currencyDigits.split(".");
if (parts.length > 1) {
 integral = parts[0];
 decimal = parts[1];
 // Cut down redundant decimal digits that are after the second.
 decimal = decimal.substr(0, 2);
}
else {
 integral = parts[0];
 decimal = "";
}
// Prepare the characters corresponding to the digits:
digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT,CN_NINE);
radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);
bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);
decimals = new Array(CN_TEN_CENT, CN_CENT);
// Start processing:
outputCharacters = "";
// Process integral part if it is larger than 0:
if (Number(integral) > 0) {
 zeroCount = 0;
 for (i = 0; i < integral.length; i++) {
  p = integral.length - i - 1;
  d = integral.substr(i, 1);
  quotient = p / 4;
  modulus = p % 4;
  if (d == "0") {
  zeroCount++;
  }
  else {
  if (zeroCount > 0)
  {
   outputCharacters += digits[0];
  }
  zeroCount = 0;
  outputCharacters += digits[Number(d)] + radices[modulus];
  }
  if (modulus == 0 && zeroCount < 4) { 
  outputCharacters += bigRadices[quotient];
  }
 }
 outputCharacters += CN_DOLLAR;
}
// Process decimal part if there is:
if (decimal != "") {
 for (i = 0; i < decimal.length; i++) {
  d = decimal.substr(i, 1);
  if (d != "0") {
  outputCharacters += digits[Number(d)] + decimals[i];
  }
 }
}
// Confirm and return the final output string:
if (outputCharacters == "") {
 outputCharacters = CN_ZERO + CN_DOLLAR;
}
if (decimal == "") {
 outputCharacters += CN_INTEGER;
}
//outputCharacters = CN_SYMBOL + outputCharacters;
outputCharacters = outputCharacters;
return outputCharacters;
}// 
var stmp = "";
function nst_convert(t)
{
  if(t.value==stmp) return;//如果等于上次输入则返回
  var ms = t.value.replace(/[^\d\.]/g,"").replace(/(\.\d{2}).+$/,"$1").replace(/^0+([1-9])/,"$1").replace(/^0+$/,"0");
  //replace(/[^\d\.]/g,"")去掉输入当中不是数字和.的字符
  //replace(/(\.\d{2}).+$/,"$1") 
  //匹配从字符开始的第一个.后面的所有字符,由于没有使用g标记,
  //所以只匹配开始第一次  然后用小数点和后两位进行替换以确定数值最后的格式正确 高.
  //replace(/^0+([1-9])/,"$1") 匹配以多个0开头的数值替换为去掉0后的数值做为数字的第一位 也是匹配开始的一次.
  //replace(/^0+$/,"0") 匹配以0开始和结束的多个0为一个0 也就是0000000 输入->转换成一个0
  //以下确定输入的为过滤后的合法数字
  //alert(ms);
  var txt = ms.split(".");
  //alert(txt[0]);
  //如果ms值不小数点存在则txt[0]=小数点前的值否则等于ms
  //regexp:/\d{4}(,|$)/ 匹配四位数字和,的集合或者四位数字和字符结尾的集合
  while(/\d{4}(,|$)/.test(txt[0]))//如果为txt[0]=4123
   txt[0] = txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2");
  //txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2")是将txt[0]进行替换后再赋给它
  //regexp:/(\d)(\d{3}(,|$))/ 将四个数字份为两组第一个数字为第一位,后三位和其他结尾为每二位
  //并替换成 第一位,第二位 注意 ,的使用很好.  也就是将4123先替换成4,123
  //由于此表达式默认采用贪婪匹配所以从数值后向前匹配再通过循环进行再匹配替换从而可以将
  //12345678分成你想要的123,456,78 彩用(,|$)很精典,因为它略去了第二次匹配时的,问题
  t.value = stmp = txt[0]+(txt.length>1?"."+txt[1]:"");
  //最终赋值到输入框中 
  //如果有小数点则加上并购成最终数字否则显示替换后的txt[0]
  bbb.value = convertCurrency(ms-0);
  //将ms转换为数字送到number2num1去转换
}

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

PHP 相关文章推荐
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
php中模拟POST传递数据的两种方法分享
Sep 16 PHP
基于curl数据采集之单页面采集函数get_html的使用
Apr 28 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
Aug 07 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
摘自织梦CMS的HTTP文件下载类
Aug 08 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
php微信高级接口群发 多客服
Jun 23 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
php实现的简易扫雷游戏实例
Jul 09 #PHP
php链表用法实例分析
Jul 09 #PHP
php结合curl实现多线程抓取
Jul 09 #PHP
php基本函数汇总
Jul 09 #PHP
php+curl 发送图片处理代码分享
Jul 09 #PHP
在Debian系统下配置LNMP的教程
Jul 09 #PHP
PHP+Mysql基于事务处理实现转账功能的方法
Jul 08 #PHP
You might like
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
angular实现input输入监听的示例
2018/08/31 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
[51:22]Fnatic vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Windows下python2.7.8安装图文教程
2016/05/26 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
护理专业毕业生自我鉴定
2013/10/08 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
高中课程设置方案
2014/05/28 职场文书
金融管理专业求职信
2014/07/10 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
合同和协议有什么区别?
2014/10/08 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
收银员岗位职责
2015/02/03 职场文书
应聘教师自荐信
2015/03/26 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
关于Vue中的options选项
2022/03/22 Vue.js