# script_name: numbers_to_chinese # usage: perl number2_to_chinese.pl 30806 # result: 三万零八百零六 my %cn_numbers=( 1=>"一", 2=>"二", 3=>"三", 4=>"四", 5=>"五", 6=>"六", 7=>"七", 8=>"八", 9=>"九", ); my $number=shift; my $cn_number; if ($number>=10000){ my $n=$number/10000; $n=~s/\..*//; $cn_number=$cn_numbers{$n}."万"; $number=$number % 10000; } if ($number>=1000){ my $n=$number/1000; $n=~s/\..*//; $cn_number.=$cn_numbers{$n}."千"; $number=$number % 1000; } if ($number>=100){ my $n=$number/100; $n=~s/\..*//; $cn_number.=$cn_numbers{$n}."百"; $number=$number % 100; } if ($number>=10){ my $n=$number/10; $n=~s/\..*//; $cn_number.=$cn_numbers{$n}."十"; $number=$number % 10; } if ($number>0){ $cn_number.=$cn_numbers{$number}; } #补零 if ($cn_number=~/万/ && $cn_number!~/千/){ $cn_number=~s/万/万零/; } if ($cn_number=~/千/ && $cn_number!~/百/){ $cn_number=~s/千/千零/; } if ($cn_number=~/百/ && $cn_number!~/十/){ $cn_number=~s/百/百零/; } $cn_number=~s/一十/十/g; print "$cn_number\n";

Replies are listed 'Best First'.
Re: english numbers to chinese numbers
by AnomalousMonk (Archbishop) on Feb 08, 2017 at 07:54 UTC

    Please save yourself some effort in future and use  <code> ... </code> tags; please see Markup in the Monastery and Writeup Formatting Tips.

    my $n=$number/10000;
    $n=~s/\..*//;

    The purpose of the  s/\..*// substitution seems to to be to truncate a number to an integer. The built-in function int exists for this purpose
        my $n = int($number/10000);
    or one could simply put a useinteger; statement at the beginning of one's code and all arithmetic operations thereafter will be integer operations:

    use warnings; use strict; use integer; ... my $n = $number/10000; ... my $n = $number/1000; ...


    Give a man a fish:  <%-{-{-{-<

      Hi AnomalousMonk,

      use <code> ... </code> tags

      AFAIK <code> tags don't do unicode:

      # result: &#19977;&#19975;&#38646;&#20843;&#30334;&#38646;&#20845;

      Although the post will be missing the [download] link, I'd suggest <pre> tags:

      # result: 三万零八百零六
      

      Update: Or, of course, the OP could use plain ASCII and write unicode characters as e.g. \x{4e09}.

      Regards,
      -- Hauke D

Re: english numbers to chinese numbers
by kcott (Archbishop) on Feb 09, 2017 at 08:38 UTC

    G'day changlehu,

    Welcome to the Monastery.

    I saw the comments[1, 2] regarding the formatting of your post. I took at look at the source HTML: you'd clearly made some effort to improve the formatting. Your code had reasonable indentation (which we can't see when it's posted as paragraph text); you'd also added <br /> tags to the end of every line.

    So, when posting ASCII code or data, do use <code> tags; otherwise, use <pre> tags. Do follow the links provided: they provide more details on this.

    Anyway, as this was your first post, and you'd obviously made some effort to get it right, here's how your posted code would have looked with <pre> tags (and without any <br /> tags):

    my %cn_numbers=(
        1=>"一",
        2=>"二",
        3=>"三",
        4=>"四",
        5=>"五",
        6=>"六",
        7=>"七",
        8=>"八",
        9=>"九",
    );
    my $number=shift;
    my $cn_number;
    if ($number>=10000){
        my $n=$number/10000;
        $n=~s/\..*//;
        $cn_number=$cn_numbers{$n}."万";
        $number=$number % 10000;
    }
    if ($number>=1000){
        my $n=$number/1000;
        $n=~s/\..*//;
        $cn_number.=$cn_numbers{$n}."千";
        $number=$number % 1000;
    }
    if ($number>=100){
        my $n=$number/100;
        $n=~s/\..*//;
        $cn_number.=$cn_numbers{$n}."百";
        $number=$number % 100;
    }
    if ($number>=10){
        my $n=$number/10;
        $n=~s/\..*//;
        $cn_number.=$cn_numbers{$n}."十";
        $number=$number % 10;
    }
    if ($number>0){
        $cn_number.=$cn_numbers{$number};
    }
    #补零
    if ($cn_number=~/万/ && $cn_number!~/千/){
        $cn_number=~s/万/万零/;
    }
    if ($cn_number=~/千/ && $cn_number!~/百/){
        $cn_number=~s/千/千零/;
    }
    if ($cn_number=~/百/ && $cn_number!~/十/){
        $cn_number=~s/百/百零/;
    }
    $cn_number=~s/一十/十/g;
    print "$cn_number\n";
    

    When I first read your post yesterday, I really had no idea what the code was doing because I have zero knowledge of the language. However, when researching something entirely different earlier today (CSS Counter Styles Level 3), I came across this section, which explained all the characters and how the numbers were built up. That may be of interest to others who wish to understand your code more fully.

    — Ken

Re: english numbers to chinese numbers
by FreeBeerReekingMonk (Deacon) on May 09, 2017 at 18:18 UTC
    hmm... my comment was lost... I added wàn (1'0000) and shíwàn (10'0000)

    I liked it very much, though I saw some discrepancies on the web (I do not know Chinese... just doing it by websites)

    This website seems to translate the Chinese characters into something else...

    my $number=shift; print "Received Number($number)";

    @CN_NUMBERS = qw(零 一 二 三 四 五 六 七 八 九); my %cn_numbers= map {$_ => $CN_NUMBERS[$_]} 0..$#CN_NUMBERS;

    my $cn_number; if ($number>=10000){ my $n=$number/10000; $n=~s/\..*//; $cn_number=$cn_numbers{$n}."万"; $number=$number % 10000; } if ($number>=1000){ my $n=$number/1000; $n=~s/\..*//; $cn_number.=$cn_numbers{$n}."千"; $number=$number % 1000; } if ($number>=100){ my $n=$number/100; $n=~s/\..*//; $cn_number.=$cn_numbers{$n}."百"; $number=$number % 100; } if ($number>=10){ my $n=$number/10; $n=~s/\..*//; $cn_number.=$cn_numbers{$n}."十"; $number=$number % 10; } if ($number>0){ $cn_number.=$CN_NUMBERS[$number]; }

    print "UNDEFINED" unless(defined $cn_number); $cn_number .= $CN_NUMBERS[0] unless(defined $cn_number); print "!!!!()\n";

    # 1,000: 千 (仟) qiān if ($cn_number=~/万/ && $cn_number!~/千/){ $cn_number=~s/万/万零/; }

    # 10,000: 万 (萬) wàn (1'0000) if ($cn_number=~/千/ && $cn_number!~/百/){ $cn_number=~s/千/千零/; }

    # 100,000: 十万 (萬) shíwàn (10'0000) if ($cn_number=~/百/ && $cn_number!~/十/){ $cn_number=~s/百/百零/; }

    $cn_number=~s/一十/十/g; print "$cn_number\n";

    edit: used pre and to mask the [] for arrays I used code