[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创代码] [造轮子]Perl脚本金额数字转中文大写

保存为utf-8文本格式。
没有做太多测试,欢迎测试BUG,欢迎各位分享更简单的代码。
  1. use utf8;
  2. use Encode;
  3. binmode(STDOUT, ":encoding(gbk)");
  4. our @unit_f = ("", "角");            #分省略,最后补上
  5. our @part = ("", "萬", "亿");        #元省略,最后补上
  6. our @unit = ("", "拾", "佰", "仟");  #同上
  7. our @cnum = qw/零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾/;
  8. my ($inp, $str, $sect) = (undef, "", "");
  9. my ($ni, $nf, $i);
  10. my ($fa, $fb);
  11. $inp=50050001.51;
  12. ($ni, $nf) = split(/\./, sprintf("%.2f", $inp));
  13. $i = 0;
  14. #处理整数部分
  15. while ($ni ne "") {
  16.     $ni=~s/(\d{0,4})$//;    #每四位数为一段进行截取
  17.     $sect = &func($1);
  18.         # 如果某段大写返回为空(全0的情况),则缩略
  19.         # 例如壹亿,而不是壹亿萬
  20.     if ($sect ne "") {
  21.         $str = $sect . $part[$i] . $str;      
  22.     }
  23.     $i++;
  24. }
  25. $str = $str."元";
  26. #处理角和分
  27. @unit = (@unit_f);
  28. $sect = &func($nf);
  29. if ($sect ne "") {
  30.     $str = $str . $sect;
  31.     $str = $str ."分" unless ($sect=~/角$/);
  32. }
  33. print $str;
  34. sub func {
  35.     our @unit;
  36.     our @cnum;
  37.     my @ints = reverse( split("", $_[0]) );  #反转成 (个,十,佰,仟)
  38.     my $prev = 1;
  39.     my $begin = 0;
  40.     my $i;
  41.     my $str = "";
  42.     #如果低位连续出现零,略过。
  43.     #例如,一百零拾零元简写为:一百元
  44.     while (
  45.         defined $ints[$begin]
  46.             and
  47.         $ints[$begin] == 0
  48.     ) {
  49.         $begin++;
  50.     }
  51.     foreach $i ($begin .. $#ints) {
  52.         if (
  53.             $ints[$i] == 0
  54.         ) {
  55.             if ($prev != 0) {
  56.                 $str = $cnum[$ints[$i]] . $str;     #零
  57.                 $prev = 0;
  58.             }
  59.             next;
  60.         }
  61.         $prev = $ints[$i];
  62.         $str = $cnum[$ints[$i]] . $unit[$i] . $str;
  63.     }
  64.     return $str;
  65. }
复制代码
1

评分人数

本帖最后由 523066680 于 2014-9-15 15:17 编辑

回复 3# neorobin

对比之下发现我那个漏了零元整以及零点几的情况。
另:
    nerobin有没有学C/C++,看之前的分析代码应该是会C的

TOP

回复 5# neorobin

       早一点撸C/C++,我觉得现阶段的nerobin需要更强大的语言去实现那些想法。
关键是有些轮子造出来后,后期维护起来方便很多。批处理写复杂了,时间久了就算有BUG也不想改了。

我觉得。

TOP

回复 7# neorobin


    好吧。

TOP

回复 10# CrLf


    因为PHP是世界上最好的语言?!

TOP

回复 12# CrLf


    肚腩照明月?

TOP

本帖最后由 523066680 于 2014-9-15 22:09 编辑

回复 14# CrLf


    我是说你晚上吃这么多是要撑破肚皮晒月亮么? CU那个肚腩照明月Perl好像很老练啊。
  走,我们去文字消遣区。

TOP

本帖最后由 523066680 于 2014-9-16 08:59 编辑

稍微做了改进
  1. use IO::Handle;
  2. use utf8;
  3. use Encode;
  4. STDOUT->autoflush(1);
  5. STDERR->autoflush(1);
  6. binmode(STDOUT, ":encoding(gbk)");
  7. our @unit_f = ("", "角");            #分省略,最后补上
  8. our @part = ("", "萬", "亿");        #元省略,最后补上
  9. our @unit = ("", "拾", "佰", "仟");  #同上
  10. our @cnum = qw/零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾/;
  11. foreach (
  12.     1.01,
  13.     900000000,
  14.     0.0,
  15.     7.2,
  16.     12300100.12,
  17.     101010101
  18. ) {
  19.     printf &main($_) . "\n";
  20. }
  21. <STDIN>;
  22. sub main {
  23.     my $inp = shift;
  24.     my ($str, $sect) = ("", "");
  25.     my ($ni, $nf, $i) = ("", "", undef);
  26.     return "零元" if ($inp == 0);
  27.     #整数部分和小数部分
  28.     ($ni, $nf) = split(/\./, sprintf("%.2f", $inp));
  29.     #处理整数部分
  30.     $i = 0;
  31.     while ($ni ne "") {
  32.         $ni=~s/(\d{0,4})$//;       #每四位数为一段进行截取
  33.         $sect = &func($1, \@unit);
  34.                                    # 如果某段大写返回为空(0000),则缩略
  35.                                    # 例如壹亿,而不是壹亿萬
  36.         if ($sect ne "") {
  37.             $str = $sect . $part[$i] . $str;      
  38.         }
  39.         $i++;
  40.     }
  41.     $str .="元" if ($str ne "");
  42.     #处理角和分
  43.     $sect = &func($nf, \@unit_f);
  44.     if ($sect ne "") {
  45.         $str = $str . $sect;
  46.         $str = $str ."分" unless ($sect=~/角$/);
  47.     }
  48.     return $str;
  49. }
  50. sub func {
  51.     our @cnum;
  52.     my ($num, $unit) = (shift, shift);
  53.     my @ints = reverse( split("", $num) );  #反转成 (个,十,佰,仟)
  54.     my $prev = 1;
  55.     my $begin = 0;
  56.     my $i;
  57.     my $str = "";
  58.     #略过低位连续出现的零
  59.     #例如,一百零拾零元简写为:一百元
  60.     while (
  61.         defined $ints[$begin]
  62.             and
  63.         $ints[$begin] == 0
  64.     ) {
  65.         $begin++;
  66.     }
  67.     foreach $i ($begin .. $#ints) {
  68.         if (
  69.             $ints[$i] == 0
  70.         ) {
  71.             if ($prev != 0) {
  72.                 $str = $cnum[$ints[$i]] . $str;   #零
  73.                 $prev = 0;
  74.             }
  75.             next;
  76.         }
  77.         $prev = $ints[$i];
  78.         $str = $cnum[$ints[$i]] . $unit->[$i] . $str;
  79.     }
  80.     return $str;
  81. }
复制代码

TOP

返回列表