<?php
/*
PHP版阿拉伯数字RMB转化大写人民币 BY厕所的灯 AT 2005-03-24
因为小数点后最多只有2位,所以我没有用递归,直接一个数一个数取的,整数位用的是递归计算的,感觉精华也是在此,呵呵
详看注释
*/
$string_num = array(); //中文大写数字
$string_cn1 = array(); //中文单位
$string_cn2 = array(); //中文单位
$moneyString = ''; //最后的中文结果
$string_num[0] = '零';
$string_num[1] = '壹';
$string_num[2] = '贰';
$string_num[3] = '叁';
$string_num[4] = '肆';
$string_num[5] = '伍';
$string_num[6] = '陆';
$string_num[7] = '柒';
$string_num[8] = '捌';
$string_num[9] = '玖';
$string_cn1[2] = '拾';
$string_cn1[3] = '佰';
$string_cn1[4] = '仟';
$string_cn2[1] = '角';
$string_cn2[2] = '分';
function getMoneyString($num)
{
global $string_num, $string_cn1, $string_cn2, $moneyString;
if (!eregi("^[0-9]+[\.]?[0-9]{0,2}$",$num))
return '初始错误,数值非法';
$tmp = explode('.', $num); //把小数和整数分别来计算
$num1 = $tmp[0];
$num2 = $tmp[1];
/*
处理整数部分
把整数分为三中情况,1:亿以上的;2:万以上的;3:万以下的
分别为第9(亿),第5(万)位
*/
if ($num1 > 0)
{
getAll($num1, '圆'); //如果整数部分不为0 最后单位为圆
}
else
{
$moneyString = '零圆';
}
//处理小数
if (intval($num2) == 0)
$moneyString .= '整'; //整数处理完毕,如果小数不存在 则加个‘整’字
else
{
//小数这里我是直接一个数一个数取的
if ($num2{0} == 0)
{
//十分位为0的情况
$moneyString .= '零' . $string_num[$num2{1}] . $string_cn2[2];
}
elseif ($num2{1} == 0)
{
//百分位为0的情况
$moneyString .= $string_num[$num2{0}] . $string_cn2[1] . '整';
}
else
{
//都不为0的情况
$moneyString .= $string_num[$num2{0}] . $string_cn2[1] . $string_num[$num2{1}] . $string_cn2[2];
}
}
return $moneyString;
}
function getAll($num , $dw) //$num 为数值 $dw为单位
{
global $string_num, $string_cn1, $string_cn2, $moneyString;
$numlen = strlen($num);
if ($num < 10000)
{
if ($num == 0)
$moneyString .= $dw;
else
$moneyString .= getPart($num) . $dw;
}
elseif ($num < 100000000)
{
$moneyString .= getAll(substr(strval($num), 0, ($numlen - 4)), '万') . getAll(substr(strval($num), ($numlen - 4)), $dw);
}
else
{
//亿是最大单位,如果超过亿,则把亿以上部分数字当成一部分进行读取
$moneyString .= getAll(substr(strval($num), 0, ($numlen - 8)), '亿') . getAll(substr(strval($num), ($numlen - 8)), $dw);
}
}
//0-9999数字的读取
function getPart($num)
{
global $string_num, $string_cn1, $string_cn2, $moneyString;
$is_zero = false; //判断是否有连续零的标记
$numlen = strlen($num);
$str = '';
$x = 0;
for ($i = $numlen; $i > 0; $i--)
{
$t = $num{$x};
if (intval(substr($num ,$x)) == 0)
{
//如果从当前$x位置出到最后为连续0则留空
$str .= '';
}
elseif (!$is_zero && $t == 0)
{
//第一次出现0则。。。
$str .= '零';
$is_zero = true;
}
elseif ($is_zero && $t == 0)
{
//连续出现则留空
$str .= '';
}
else
{
$str .= $string_num[$t] . $string_cn1[$i];
$is_zero = false;
}
$x++;
}
return $str;
}
//演示
$num = "100600000";
echo $num . "<br>";
echo getMoneyString($num) . "<hr>";
$moneyString = '';
$num = "20000000000000000000000";
echo $num . "<br>";
echo getMoneyString($num) . "<hr>";
$moneyString = '';
$num = "120.54";
echo $num . "<br>";
echo getMoneyString($num) . "<hr>";
$moneyString = '';
$num = "31010.50";
echo $num . "<br>";
echo getMoneyString($num) . "<hr>";
if($_POST)
{
$moneyString = '';
$num = $_POST['num'];
echo "您输入的是" . $num . "<br>";
echo "返回结果:".getMoneyString($num) . "<hr>";
}
echo "<form method=post>数字<input type=text name='num' size=20> <input type=submit value=转换></form>";
?>
转载于:https://my.oschina.net/bufenye/blog/39844