数字格式化:
/**
* 格式化数字为大写
* @param $number
* @return mixed|string
*/
function formatter_capital($number,$capital = false){
// 判断输入的是否为数字
if(!is_numeric($number)){
return "要转换的数字只能为数字!";
}
// 数字不能为负数
if($number < 0) {
return "要转换的数字不能为负数!";
}
$cnums = true == $capital ? array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖") : array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
$cnyunits = array("点","","");
$grees = true == $capital ? array("十","百","千","万","拾","百","千","亿") : array("拾","佰","仟","万","拾","佰","仟","亿");
$is_decimal = strpos($number,'.') ? true : false ;
if($is_decimal)
{
list($ns1,$ns2)=explode(".",$number);
}else{
$ns1 = &$number;
}
// 数字不能超过万亿,即12位
if(strlen($ns1) > 12) {
return "要转换的数字不能为万亿及更高!";
}
$ns2=$is_decimal ? array_reverse(str_split($ns2)) : array();
$ret=array_merge($ns2,array(implode("",formatter_capital_map_unit(str_split($ns1),$grees))));
$ret=implode("",array_reverse(formatter_capital_map_unit($ret,$cnyunits,$is_decimal)));
return str_replace(array_keys($cnums),$cnums,$ret);
}
/**
* 格式化数字为大写 辅助函数
* @param $list
* @param $units
* @param bool $is_decimal 是否有小数
* @return array
*/
function formatter_capital_map_unit($list,$units,$is_decimal = false) {
$ul=count($units);
$xs=array();
foreach (array_reverse($list) as $k=>$x) {
$l=count($xs);
if ($x!="0" || !($l%4)){
if(true == $is_decimal)
{
$n = $k == 0 ? ($x=='0'?'':$x).($units[$k]) : ($x=='0'?'':$x);
}else{
$n= $k == 0 ? ($x=='0'?'':$x) : ($x=='0'?'':$x).($units[abs($l-1)%$ul]);
}
}else {
$n=is_numeric($xs[0][0])?$x:'';
}
array_unshift($xs,$n);
}
return $xs;
}
/**
* 将数字转换为汉字
* @param $num
* @return string
*/
function numToWord($num)
{
$chiNum = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
$chiUni = array('','十', '百', '千', '万', '亿', '十', '百', '千');
$num_str = (string)$num;
$count = strlen($num_str);
$last_flag = true; //上一个 是否为0
$zero_flag = true; //是否第一个
$temp_num = null; //临时数字
$chiStr = '';//拼接结果
if ($count == 2) {//两位数
$temp_num = $num_str[0];
$chiStr = $temp_num == 1 ? $chiUni[1] : $chiNum[$temp_num].$chiUni[1];
$temp_num = $num_str[1];
$chiStr .= $temp_num == 0 ? '' : $chiNum[$temp_num];
}else if($count > 2){
$index = 0;
for ($i=$count-1; $i >= 0 ; $i--) {
$temp_num = $num_str[$i];
if ($temp_num == 0) {
if (!$zero_flag && !$last_flag ) {
$chiStr = $chiNum[$temp_num]. $chiStr;
$last_flag = true;
}
}else{
$chiStr = $chiNum[$temp_num].$chiUni[$index%9] .$chiStr;
$zero_flag = false;
$last_flag = false;
}
$index ++;
}
}else{
$chiStr = $chiNum[$num_str[0]];
}
return $chiStr;
}
金额格式化:
function cny($ns) {
static $cnums=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"),
$cnyunits=array("圆","角","分"),
$grees=array("拾","佰","仟","万","拾","佰","仟","亿");
list($ns1,$ns2)=explode(".",$ns,2);
$ns2=array_filter(array($ns2[1],$ns2[0]));
$ret=array_merge($ns2,array(implode("",_cny_map_unit(str_split($ns1),$grees)),""));
$ret=implode("",array_reverse(_cny_map_unit($ret,$cnyunits)));
return str_replace(array_keys($cnums),$cnums,$ret);
}
function _cny_map_unit($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;
}
//调用
$num = 123456789.12;
echo cny($num);