最近做一個財務的一個功能,其中有一個地方需要將阿拉伯數字形式的金額顯示成大寫(老寫)的漢字形式,于是有了下面的代碼。。。
function num_to_upper($num)
{
$d = array('零','壹','貳','叁','肆','伍','陸','柒','捌','玖');
$e = array('元','拾','佰','仟','萬','拾萬','佰萬','仟萬','億','拾億','佰億','仟億','萬億');
$p = array('分','角');
$zheng='整'; //追加"整"字
$final = array(); //結果
$inwan=0; //是否有萬
$inyi=0; //是否有億
$len_pointdigit=0; //小數點后長度
$y=0;
if($c = strpos($num, '.')) { //有小數點,$c為小數點前有幾位數
$len_pointdigit = strlen($num)-strpos($num, '.')-1; // 判斷小數點后有幾位數
if($c>13) { //簡單的錯誤處理
echo "數額太大,已經超出萬億.";
die();
} elseif($len_pointdigit>2) { //$len_pointdigit小數點后有幾位
echo "小數點后只支持2位.";
die();
}
} else { //無小數點
$c = strlen($num);
$zheng = '整';
}
for($i=0;$i<$c;$i++) { //處理整數部分
$bit_num = substr($num, $i, 1); //逐字讀取 左->右
if($bit_num!=0 || substr($num, $i+1, 1)!=0) //當前是零 下一位還是零的話 就不顯示
@$low2chinses = $low2chinses.$d[$bit_num];
if($bit_num || $i==$c-1)
@$low2chinses = $low2chinses.$e[$c-$i-1];
}
for($j=$len_pointdigit; $j>=1; $j--) { //處理小數部分
$point_num = substr($num, strlen($num)-$j, 1); //逐字讀取 左->右
if($point_num != 0)
@$low2chinses = $low2chinses.$d[$point_num].$p[$j-1];
// if(substr($num, strlen($num)-2, 1)==0 && substr($num, strlen($num)-1, 1)==0) //小數點后兩位都是0
}
$chinses = str_split($low2chinses,2); //字符串轉換成數組
//print_r($chinses);
for($x=sizeof($chinses)-1;$x>=0;$x--) { //過濾無效的信息
if($inwan==0&&$chinses[$x]==$e[4]) { //過濾重復的"萬"
$final[$y++] = $chinses[$x];
$inwan=1;
}
if($inyi==0&&$chinses[$x]==$e[8]) { //過濾重復的"億"
$final[$y++] = $chinses[$x];
$inyi=1;
$inwan=0;
}
if($chinses[$x]!=$e[4]&&$chinses[$x]!=$e[8]) //進行整理,將最后的值賦予$final數組
$final[$y++] = $chinses[$x];
}
$newstring=(array_reverse($final)); //$final為倒數組,$newstring為正??梢允褂玫臄到M
$nstring=join($newstring); //數組變成字符串
if(substr($num,-2,1)==0 && substr($num,-1)<>0) { //判斷原金額角位為0 ? 分位不為0 ?
$nstring=substr($nstring,0,(strlen($nstring)-4))."零".substr($nstring,-4,4); //這樣加一個零字
}
$fen="分";
$fj=substr_count($nstring, $fen); //如果沒有查到分這個字
return $nstring=($fj==0)?$nstring.$zheng:$nstring; //就將"整"加到后面
}
新聞熱點
疑難解答