php人民幣小寫轉大寫函式,不限長度,精確到分
在列印發票或顯示賬單的時候我們經常會需要將人民幣的金額由小寫轉為大寫,下面是我改進的一個函式,支援如下的特性:
- 1.支援天文數字,整數位理論上可以無限的長;
- 2.支援小數,對於貨幣,一般精確到小數後兩位,可以設定小數位是否四捨五入;
- 3.支援自定義貨幣單位,有的系統要求大寫是”圓”,有的要求是”元”,可以自定義;
- 4.支援整數以0結束並含有小數的數字自定義末尾補”零”,比如有的系統要求1960.30這樣的數字轉大寫之後是”壹仟玖佰陸拾元叄角”,而有的系統則要求”壹仟玖佰陸拾元零叄角”,這兩種情況按”正確填寫票據和結算憑證的基本規定“都是正確的,現在可已自定義.
- /**
- * 人民幣小寫轉大寫
- *
- * @param string $number 數值
- * @param string $int_unit 幣種單位,預設”元”,有的需求可能為”圓”
- * @param bool $is_round 是否對小數進行四捨五入
- * @param bool $is_extra_zero 是否對整數部分以0結尾,小數存在的數字附加0,比如1960.30,
- * 有的系統要求輸出”壹仟玖佰陸拾元零叄角”,實際上”壹仟玖佰陸拾元叄角”也是對的
- * @return string
- */
- function num2rmb($number = 0, $int_unit = `元`, $is_round = TRUE, $is_extra_zero = FALSE)
- {
- // 將數字切分成兩段
- $parts = explode(`.`, $number, 2);
- $int = isset($parts[0]) ? strval($parts[0]) : `0`;
- $dec = isset($parts[1]) ? strval($parts[1]) : “;
- // 如果小數點後多於2位,不四捨五入就直接截,否則就處理
- $dec_len = strlen($dec);
- if (isset($parts[1]) && $dec_len > 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).”<br>”;
- $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 “<pre>”;
- $number = “1000000000000000012345678900.501”;
- echo $number.“:”.num2rmb($number);
- echo ”
“; - $number = “1960.30”;
- echo $number.“:”.num2rmb($number);
- echo ”
“; - $number = “1960.30”;
- echo $number.“:”.num2rmb($number, “圓”, true, true);
- echo ”
“; - $number = “123456789.005”;
- echo $number.“:”.num2rmb($number);
- echo ”
“; - $number = “123456789.005”;
- echo $number.“:”.num2rmb($number, “元”, false);
- echo ”
“; - $number = “10000000000000000060009.101”;
- echo $number.“:”.num2rmb($number);
- echo ”
“; - $number = “1680.32”;
- echo $number.“:”.num2rmb($number);
輸出結果:
- 1000000000000000012345678900.501:壹仟億億億零壹佰貳拾叄億肆仟伍佰陸拾柒萬捌仟玖佰元伍角
- 1960.30:壹仟玖佰陸拾元叄角
- 1960.30:壹仟玖佰陸拾圓零叄角
- 123456789.005:壹億貳仟叄佰肆拾伍萬陸仟柒佰捌拾玖元零壹分
- 123456789.005:壹億貳仟叄佰肆拾伍萬陸仟柒佰捌拾玖元整
- 10000000000000000060009.101:壹佰萬億億零陸萬零玖元壹角
- 1680.32:壹仟陸佰捌拾元叄角貳分
本文轉自 ustb80 51CTO部落格,原文連結:http://blog.51cto.com/ustb80/1035327,如需轉載請自行聯絡原作者
相關文章
- 人民幣小寫轉換為大寫
- plsql小寫金額轉大寫金額函式SQL函式
- ASP.NET 實現人民幣大寫轉換函式ASP.NET函式
- 轉大寫函式MoneyCn函式
- php首字母小寫怎麼轉大寫PHP
- javascript 人民幣小寫轉換為大寫形式程式碼例項JavaScript
- lotus 中日期小寫轉大寫的函式及演算法(lotus script) (轉)函式演算法
- 在Oracle中將小寫人民幣轉換成大寫Oracle
- 人民幣大寫線上轉換工具
- 編寫自己的php擴充套件函式 (轉)PHP套件函式
- 轉Java開發 Java 小寫轉大寫Java
- 小寫轉大寫金額[SQL SERVER] (轉)SQLServer
- 自己寫的和收藏的一寫php函式PHP函式
- 小寫金額轉換為大寫
- Excel金額小寫轉大寫公式Excel公式
- 小寫數字金額轉大寫
- Linux下精確到微秒級的時間操作函式(轉)Linux函式
- 編寫自己的php擴充套件函式(一) (轉)PHP套件函式
- Go 實現字串首字母大、小寫函式Go字串函式
- pb實現列印中人民幣大寫 (轉)
- JavaScript 小寫數字轉換為大寫JavaScript
- java 人民幣大寫顯示Java
- PHP陣列函式array_change_key_case(將陣列中的所有鍵名修改為全大寫或小寫)PHP陣列函式
- string大小寫轉換函式函式
- js將小寫數字轉換為大寫形式JS
- PHP 字串中直接解析函式的寫法PHP字串函式
- 用分析函式改寫冗長的sql函式SQL
- PHP陣列學習之更改鍵/值的大寫或小寫PHP陣列
- 編寫小而美函式的藝術函式
- C++ 的函式分檔案編寫C++函式
- 四個PHP應用小函式 (轉)PHP函式
- 小寫轉大寫金額在C++中的實現 (轉)C++
- 小寫轉大寫金額儲存過程[SQL SERVER]儲存過程SQLServer
- Notes中人民幣大寫換算的實現 (轉)
- MySQL字串函式 字串大小寫轉換MySql字串函式
- 瞧瞧這個將CBitmap寫到Bmp檔案裡的函式 (轉)函式
- 分享一下自己寫的PHP函式PHP函式
- 常見物件-把字串的首字母轉大寫其他轉小寫物件字串