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: <%-{-{-{-<
| [reply] [d/l] [select] |
# result: 三万零八百零六
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 | [reply] [d/l] [select] |
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.
| [reply] [d/l] [select] |
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 | [reply] [d/l] [select] |