中文数字转阿拉伯数字
中文数字的权位是明的,阿拉伯数字的权位则隐含在数字的位置中。怎么将文字权位转换为数字权位,下面解析。
转换的基本方法
对于十进制阿拉伯数字,数字的所在位数就是该数字与10的倍数关系。个位就是1倍,十位就是10倍,以此类推。通过这个关系,可以将阿拉伯数字隐含的权位转换成10的倍数表示,比如“四万两千五百一十二”,等于 4*10000+2*1000+5*100+1*10+3*1.
由上述可知,从中文数字转阿拉伯数字的基本方法就是从中文数字逐个识别出数字和权位的组合,然后根据权位和阿拉伯数字倍数的对应关系计算出每个数字和权位的值,最后求和得到结果。
除上述外,因节权位常和其他权位连在一起使用;在设计算法时,由于零没有权位,因此可以直接跳过零。节权位比较特殊,它不是与之相邻的数字的倍数,二十整个小节的倍数,转换过程中要临时保存每个节权位出现前的小节的值。
代码实现
<?php
class ChineseToNumber{
public $NUMS = array('一' => '1','二' => '2','三' => '3','四' => '4','五' => '5','六' => '6','七' => '7','八' => '8','九' => '9','零'=>'');
public $b_weight = array("万亿","亿","万");
public $m_weight = array('千','百','十');
public $inp = '';
public function toNum($str){
$this->inp=$str;
//用于存节权数据
$jie = array();
foreach ($this->NUMS as $k=>$v){
//将中文数字转化为阿拉伯数字
$str = str_replace($k,$v,$str);
}
$b_jie = $this->fen($str,$this->b_weight);
foreach ($b_jie as $k=>$v){
if($v){
$m_jie = $this->fen($v,$this->m_weight);
//将每一节存起来,下标为节权进制万进制
$jie[$k*4] = $this->cou($m_jie);
}
}
$num = $this->cou($jie);
$this->pintStr($num,$this->inp);
}
//10的数组下标次方*对应值 累加
public function cou($arr){
$num = 0;
foreach ($arr as $k=>$v){
$num += intval($v)*pow(10,$k);
}
return $num;
}
//按传入的数组切分数组
来源:CSDN
作者:rms360
链接:https://blog.csdn.net/qq_39851968/article/details/103819734