程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php將金額數字轉化為中文大寫

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved