| 本文介紹下,php實現的一個人民幣小寫轉大寫的函數,不限數字長度,可以精確到分。有需要的朋友,參考下吧。 在列印發票或顯示賬單時,經常需要將人民幣的金額由小寫轉為大寫。 以下是一個改進後的人民幣小寫轉大寫的函數,功能如下: 1.支援天文數字,整數位理論上可以無限的長; 2.支援小數,對於貨幣,一般精確到小數後兩位,可以設定小數位是否四捨五入; 3.支援自訂貨幣單位,有的系統要求大寫是"圓",有的要求是"元",可以自訂; 4.支援整數以0結束並含有小數的數字自訂末尾補"零",比如有的系統要求1960.30這樣的數字轉大寫之後是"壹仟玖佰陸拾元三角",而有的系統則要求"壹仟玖佰陸拾元零三角",這兩種情況按"正確填寫票據和結算憑證的基本規定"都是正確的,現在可已自訂。 執行個體代碼: 2) { $dec = $is_round ? substr(strrchr(strval(round(floatval("0.".$dec), 2)), '.'), 1) : 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)." "; $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 $res; } echo ""; $number = "1000000000000000012345678900.501"; echo $number.":".num2rmb($number); echo "\n"; $number = "1960.30"; echo $number.":".num2rmb($number); echo "\n"; $number = "1960.30"; echo $number.":".num2rmb($number, "圓", true, true); echo "\n"; $number = "123456789.005"; echo $number.":".num2rmb($number); echo "\n"; $number = "123456789.005"; echo $number.":".num2rmb($number, "元", false); echo "\n"; $number = "10000000000000000060009.101"; echo $number.":".num2rmb($number); echo "\n"; $number = "1680.32"; echo $number.":".num2rmb($number);?> 輸出結果: 1000000000000000012345678900.501:壹仟億億億零壹佰貳拾三億肆仟伍佰陸拾柒萬捌仟玖佰元伍角 1960.30:壹仟玖佰陸拾元三角 1960.30:壹仟玖佰陸拾圓零三角 123456789.005:壹億貳仟三佰肆拾伍萬陸仟柒佰捌拾玖元零壹分 123456789.005:壹億貳仟三佰肆拾伍萬陸仟柒佰捌拾玖元整 10000000000000000060009.101:壹佰萬億億零陸萬零玖元壹角 1680.32:壹仟陸佰捌拾元三角貳分 |