本文給大家匯總介紹了幾種php將金額數字轉化為中文大寫的實用函數,各有優劣,小伙伴們根據自己的項目需求自由選擇吧。
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去轉換
- }
以上所述就是本文的全部內容了,希望大家能夠喜歡。
新聞熱點
疑難解答