最近遇到了一个关于数字转换中文字符串的问题,以前都是用的字符串替换,觉得太蠢了而且很费时间,所以决定重新写一个。
代码如下:
use strict;
use warnings;
use Data::Dumper;
use Encode;
## 递归求结果
sub reslutToCH{
my $input_CH = shift();
$input_CH = int($input_CH + 0.5); ## 四舍五入去整
my $string_CH = "";
## 计算数字长度
my $numLenth = length($input_CH);
## 根据数字长度判断为何种位数的数字
if($numLenth eq 1){
## 个
$string_CH .= numberGetCH($input_CH);
return $string_CH;
}
elsif($numLenth eq 2){
## 十
## 判断是否为十
if(substr($input_CH, 0, 1) eq 1){
$string_CH .= "十";
}else{
## 计算十位
$string_CH .= numberGetCH(int($input_CH / 10))."十";
}
## 取余数
$string_CH .= reslutToCH($input_CH % 10);
}
elsif($numLenth eq 3){
## 百
$string_CH = numberGetCH(int($input_CH / 100))."百";
## 如果余数长度小于2 并且余数不等于0
if(length($input_CH % 100) < 2 && ($input_CH % 100) > 0){
$string_CH .= "零";
}
$string_CH .= reslutToCH(int($input_CH % 100));
}
elsif($numLenth eq 4){
## 千
$string_CH = numberGetCH(int($input_CH / 1000))."千";
## 如果余数长度小于3 并且余数不等于0
if(length($input_CH % 1000) < 3 && ($input_CH % 1000) > 0){
$string_CH .= "零";
}
$string_CH .= reslutToCH(int($input_CH % 1000));
}
elsif($numLenth eq 5){
## 万
$string_CH = numberGetCH(int($input_CH / 10000))."万";
## 如果余数长度小于4 并且余数不等于0
if(length($input_CH % 10000) < 4 && ($input_CH % 10000) > 0){
$string_CH .= "零";
}
$string_CH .= reslutToCH(int($input_CH % 10000));
}
return $string_CH;
}
## 基础数字方法
sub numberGetCH{
my $input = shift;
my $resultString = "";
$input = int($input + 0.5); ## 四舍五入
if($input eq 1){
$resultString = "一";
}elsif($input eq 2){
$resultString = "二";
}
elsif($input eq 3){
$resultString = "三";
}
elsif($input eq 4){
$resultString = "四";
}
elsif($input eq 5){
$resultString = "五";
}
elsif($input eq 6){
$resultString = "六";
}
elsif($input eq 7){
$resultString = "七";
}
elsif($input eq 8){
$resultString = "八";
}
elsif($input eq 9){
$resultString = "九";
}
$resultString = encode('utf8', $resultString);
$resultString = decode('utf8', $resultString);
return $resultString;
}
这里需要注意,当最后输入数字末尾未 “0”时,需要特殊处理,将末尾未“0”的给过滤掉,不然就会出现 10580=“一万零五百八零”的结果。
“0”这个数字比较特殊,单独进行转换。
这段代码利用了递归的方式进行处理字符串。更加的方便快捷,其实可以继续增加数量级,但是由于我只需要用到“万”,就没有继续往下写。
有兴致的童鞋可以继续往下写哦~