php將金額數字轉化為中文大寫_php技巧

來源:互聯網
上載者:User

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去轉換}

以上所述就是本文的全部內容了,希望大家能夠喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.