搜档网
当前位置:搜档网 › 汉语大写数字转换成阿拉伯数字

汉语大写数字转换成阿拉伯数字

use strict;
my %Digit2Num=(
#'零'=>0,
'一'=>1,
'二'=>2,
'三'=>3,
'四'=>4,
'五'=>5,
'六'=>6,
'七'=>7,
'八'=>8,
'九'=>9,
);
my %Str2Num=(
'十'=>10,
'百'=>100,
'千'=>1000,
'万'=>10000,
#'亿'=>100000000,
);
sub ToNum{
my $numstr=$_[0];
my $i=index($numstr,'亿');
($i>-1)?ToNum2(substr($numstr,0,$i)).sprintf('%08d',ToNum2(substr($numstr,$i+2))):ToNum2($numstr)
}
sub ToNum2{
my $numstr=$_[0];
if(length($numstr)==2){
return ($numstr ne '十')?$Digit2Num{$numstr}:10;
} elsif(length($numstr)==0){
return 0
}
my @ch=unpack('(A2)*',$numstr);
my $Len=@ch;
my ($i,$curbase,$maxbase,$num,$find,$Ch);
for(;$i<$Len;$i++){
$Ch=$ch[$i];
next if($Ch eq '零');
$find=$Digit2Num{$Ch};
if($find){
$i+=1;
if($i==$Len){
$num+=$find;
last;
}
$curbase =$Str2Num{$ch[$i]};
if($curbase != 10000){
$num+=$find*$curbase
} else {
$num+=$find;
$num*=10000;
}
} else {
if($Ch eq '万'){
$num*=10000
} elsif($Ch eq '十'){
$num+=10
} else {print "不识别 $numstr\n"}
}
}
$num
}
my @Lines = (
'一千二百二十一万九千三百五十七亿一千二百二十一万九千零五十七',
'一千二百二十一',
'一千零十',
'一万零一百',
'一千零十一',
'一万零一百十一',
'一千二百十九',
'十亿零十',
'一十一',
'一百十万',
'一',
);
for(@Lines) {
print $_,' ',ToNum($_),"\n";
}

相关主题