$minus = "負"; @digits = ("零", "一", "二", "三", "四", "五", "六", "七", "八", "九"); @beforeWan = ("十", "百", "千"); @afterWan = ("", "萬", "億", "兆", "京"); $TEN = 10; # The heart of the program. Does the actual conversion sub EnglishToChineseNumber { my($enumber) = @_; # input is a integer, e.g. 938 my(@powers) = (); my($power) = 0; my($value) = 0; my($negative) = 0; # is it a negative integer? my($inzero) = 0; # are we in a stretch or 1 or more zeros (only add one zero for the stretch) my($canaddzero) = 0; # only add a zero if there's something non-zero on both sides of it my($cnumber) = ""; # the final result # If zero, just return zero if ($enumber == 0) { return $digits[0]; } # Check if it's negative, set the negative flag and make it positive if ($enumber < 0) { $negative = 1; $enumber = -$enumber; } # Get the value of the coefficient for each power of ten while ($TEN ** $power <= $enumber) { $value = ($enumber % ($TEN** ($power+1)))/($TEN**$power); $powers[$power] = $value; # Subtract out the current power's coefficient and increase the power $enumber -= $enumber % ($TEN**($power+1)); $power++; } # Take the decomposition of the number for above and generate the Chinese equivalent for ($i = 0; $i < $power; $i++) { #System.out.println("10^" + i + ":\t" + powers[i]); if (($i % 4) == 0) { # Reached the next four powers up level if ($powers[$i] != 0) { $inzero = 0; $canaddzero = 1; $cnumber = $digits[$powers[$i]] . $afterWan[$i/4] . $cnumber; } else { # Check that something in the next three powers is non-zero before adding if ((($i+3 < $power) && $powers[$i+3] != 0) || (($i+2 < $power) && $powers[$i+2] != 0) || (($i+1 < $power) && $powers[$i+1] != 0)) { $cnumber = $afterWan[$i/4] . $cnumber; } } } else { # Add one, tens, hundreds, or thousands place for each level if ($powers[$i] != 0) { $inzero = 0; $canaddzero = 1; if ($power == 2 && $i == 1 && $powers[$i] == 1) { # No 一 with 10 through 19 $cnumber = $beforeWan[($i % 4)-1] . $cnumber; #} else if ((i%4 = 3) && powers[i] == 2) { # when to use liang3 vs. er4 #cnumber.insert(0, ALTTWO + beforeWan[(i%4)-1]); } else { $cnumber = $digits[$powers[$i]] . $beforeWan[($i%4)-1] . $cnumber; } } else { if ($canaddzero == 1 && $inzero == 0) { # Only insert one 零 for all consecutive zeroes $inzero = 1; $cnumber = $digits[$powers[$i]] . $cnumber; } } } } # Add the negative character if ($negative == 1) { $cnumber = $minus . $cnumber; } return $cnumber; }