@fzbing
2015-06-09T10:11:28.000000Z
字数 1543
阅读 1795
php
<?php
header("Content-type:text/html;charset=utf-8");
/**
* 把汉字转化为数组. ex: '一二三' -> ['一','二','三']
* @param $str
* @return array
*/
function str2array($str)
{
$encode = mb_detect_encoding($str);
$len = mb_strlen($str, $encode);
$arr = array();
for ($i = 0; $i < $len; $i++) {
$arr[] = mb_substr($str, $i, 1, $encode);
}
return $arr;
}
/**
* 把 大写数字 转化为 阿拉伯字符串 '壹百' -> '100'
* @param $arr 标准的大写数字
* @param int $str_num_len 结果的最大可能长度
* @return string
*/
function toNum($arr, $str_num_len = 13)
{
$map = array(
'零' => 0,
'壹' => 1,
'贰' => 2,
'叁' => 3,
'肆' => 4,
'伍' => 5,
'陆' => 6,
'柒' => 7,
'捌' => 8,
'玖' => 9
);
$map2 = array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
$local = array(
'拾' => 2,
'佰' => 3,
'仟' => 4
);
$local2 = array('拾', '佰', '仟');
$len = count($arr);
// $arr 待处理的数组
// $len 数组长度
$str_num = '';
// 保存结果
// $str_num_len 结果的最大可能长度
$str_num = str_pad($str_num, $str_num_len, '0');
$j = $str_num_len - 1; // 当前指向 $str_num 的位置
$k = $str_num_len; // 指向 '个'
// 当前大位置,(个,万,亿). 从右往左遍历,$k(依次)指向 (个,万,亿) 目前最大的位置
for ($i = $len - 1; $i >= 0; $i--) {
if (in_array($arr[$i], $local2)) {// '拾', '佰', '仟'
$j = $k - $local[$arr[$i]];
} elseif (in_array($arr[$i], $map2)) {// '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'
$str_num[$j] = $map[$arr[$i]];
$j--;
} elseif ($arr[$i] === '万') { // '万'
$k = $str_num_len - 4;
$j = $k - 1;
} elseif ($arr[$i] === '亿') { // '亿'
$k = $str_num_len - 8;
$j = $k - 1;
}
}
for ($a = 0; $a < $str_num_len; $a++) {
if ($str_num[$a] !== '0') {
$str_num = substr($str_num, $a);
break;
}
}
return $str_num;
}
//$str_number = "贰仟零伍亿叁佰捌拾万零叁拾";
//$str_number = "壹佰叁拾壹亿壹仟叁佰壹拾万零陆佰伍拾叁元整";
//$str_number = "壹拾亿零贰仟叁佰捌拾壹万叁仟陆佰肆拾伍元整";
//$str_number = "贰佰零壹亿肆仟贰佰零壹万肆仟贰佰零壹元整";
//$str_number = "壹";
//$str_number = "壹亿";
$str_number = "壹亿壹仟万零壹拾";
$arr_number = str2array($str_number);
$a = toNum($arr_number);
var_dump($a);