|
Server : Apache/2.4.62 System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64 User : www ( 80) PHP Version : 8.3.8 Disable Function : NONE Directory : /domains/mandarintools/cgi-bin/ |
Upload File : |
#!/usr/bin/perl
# -*- coding: cn-big5; -*-
require "./cgi-lib.pl";
&ReadParse(*values);
$minus = "�t";
@digits = ("�s", "�@", "�G", "�T", "�|", "��", "��", "�C", "�K", "�E");
%digits = ("�s", 0,
"�@", 1,
"�G", 2,
"�T", 3,
"�|", 4,
"��", 5,
"��", 6,
"�C", 7,
"�K", 8,
"�E", 9);
@beforeWan = ("�Q", "��", "�d");
@afterWan = ("", "�U", "��", "��", "��");
%beforeWan = ("�Q", 10,
"��", 100,
"�d", 1000);
%afterWan = ("�U", 10000,
"��", 100000000,
"��", 1000000000000,
"��", 10000000000000000);
$ALTTWO = "��";
$TEN = 10;
%trad2simp = ("�t" => "��",
"�s" => "��",
"�@" => "һ",
"�G" => "��",
"�T" => "�",
"�|" => "��",
"��" => "��",
"��" => "��",
"�C" => "��",
"�K" => "��",
"�E" => "��",
"�Q" => "ʮ",
"��" => "��",
"�d" => "ǧ",
"�U" => "��",
"��" => "��",
"��" => "��",
"��" => "��");
%trad2formal = ("�t" => "�t",
"�s" => "�s",
"�@" => "��",
"�G" => "�L",
"�T" => "��",
"�|" => "�v",
"��" => "��",
"��" => "��",
"�C" => "�m",
"�K" => "��",
"�E" => "�h",
"�Q" => "�B",
"��" => "��",
"�d" => "�a",
"�U" => "�U",
"��" => "��",
"��" => "��",
"��" => "��");
%trad2unicode = ("�t" => "8CA0",
"�s" => "96F6",
"�@" => "4E00",
"�G" => "4E8C",
"�T" => "4E09",
"�|" => "56DB",
"��" => "4E94",
"��" => "516D",
"�C" => "4E03",
"�K" => "516B",
"�E" => "4E5D",
"�Q" => "5341",
"��" => "767E",
"�d" => "5343",
"�U" => "842C",
"��" => "5104",
"��" => "5146",
"��" => "5169");
%trad2pinyin = ("�t" => "fu4",
"�s" => "ling2",
"�@" => "yi1",
"�G" => "er4",
"�T" => "san1",
"�|" => "si4",
"��" => "wu3",
"��" => "liu4",
"�C" => "qi1",
"�K" => "ba1",
"�E" => "jiu3",
"�Q" => "shi2",
"��" => "bai3",
"�d" => "qian1",
"�U" => "wan4",
"��" => "yi4",
"��" => "zhao4",
"��" => "liang3");
if ($values{'outputtype'} eq "simp") {
print "Content-type: text/html; charset=gb2312\n\n";
} elsif ($values{'outputtype'} eq "gif") {
print "Content-type: text/html\n\n";
} elsif ($values{'outputtype'} eq "arabic") {
print "Content-type: text/html; charset=big5\n\n";
} elsif ($values{'outputtype'} eq "fullenglish") {
print "Content-type: text/html\n\n";
} else {
print "Content-type: text/html; charset=big5\n\n";
}
print "<HTML>\n";
print "<HEAD><TITLE>Chinese Number Results</TITLE></HEAD>\n";
print "<BODY>\n<P>\n";
$values{'englishnumber'} =~ s/[^0-9-]//g; # Erase everything not a digit
if ($values{'outputtype'} eq "arabic" or
$values{'outputtype'} eq "fullenglish") {
$result = &ChineseToEnglishNumber($values{'chinesenumber'});
} else {
$result = &EnglishToChineseNumber($values{'englishnumber'});
}
#print "outputtype " . $values{'outputtype'};
if ($values{'outputtype'} eq "arabic") {
print "Number value is " . $result;
} elsif ($values{'outputtype'} eq "trad") {
print $values{'englishnumber'} . " is " . $result;
} elsif ($values{'outputtype'} eq "simp") {
for ($j = 0; $j < length($result); $j+=2) {
$simpresult .= $trad2simp{substr($result, $j, 2)};
}
print $values{'englishnumber'} . " is " . $simpresult;
} elsif ($values{'outputtype'} eq "formal") {
for ($j = 0; $j < length($result); $j+=2) {
$formalresult .= $trad2formal{substr($result, $j, 2)};
}
print $values{'englishnumber'} . " is " . $formalresult;
} elsif ($values{'outputtype'} eq "pinyin") {
for ($j = 0; $j < length($result); $j+=2) {
$formalresult .= $trad2pinyin{substr($result, $j, 2)} . " ";
}
print $values{'englishnumber'} . " is " . $formalresult;
} elsif ($values{'outputtype'} eq "gif") {
for ($j = 0; $j < length($result); $j+=2) {
$gifresult .= "<IMG SRC=\"ugif/" . $trad2unicode{substr($result, $j, 2)} . ".gif\">";
}
print $values{'englishnumber'} . " is " . $gifresult;
}
print "</BODY>\n</HTML>\n";
# The heart of the program. Does the actual conversion
sub EnglishToChineseNumber {
my($enumber) = @_;
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;
$canaddzero = 0; # added
}
}
} 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 �s for all consecutive zeroes
$inzero = 1;
$cnumber = $digits[$powers[$i]] . $cnumber;
}
}
}
}
# Add the negative character
if ($negative == 1) {
$cnumber = $minus . $cnumber;
}
return $cnumber;
}
sub ChineseToEnglishNumber {
my($cnumber) = @_;
my($i);
my($alldigits) = 1;
if (length($cnumber) > 2) {
for ($i = 0; $i < length($cnumber); $i+=2) {
if (!defined($digits{substr($cnumber, $i, 2)})) {
$alldigits = 0;
}
}
if ($alldigits == 1) {
return &ChineseToEnglishBrief($cnumber);
} else {
return &ChineseToEnglishFull($cnumber);
}
} else {
return &ChineseToEnglishFull($cnumber);
}
}
sub ChineseToEnglishBrief {
my($cnumber) = @_;
my($place, $digitval, $total) = (0,0,0);
for ($place = 0; $place < length($cnumber)/2; $place++) {
$digitval = $digits{substr($cnumber, $place*2, 2)};
$total += $digitval * (10**(length($cnumber)/2 - 1 - $place));
}
return $total;
}
sub ChineseToEnglishFull {
my($cnumber) = @_;
my($negative) = 0;
my($cnumlength) = length($cnumber);
my($i, $j, $digitval, $power, $cchar);
my($leveltotal);
my($total);
#print "In Chinese to English Full<BR>";
for ($i = 0; $i < $cnumlength; $i+=2) {
#print "$i ";
$cchar = substr($cnumber, $i, 2);
#print "$cchar $leveltotal $power<BR>";
if (i == 0 && ($cchar eq "" || $cchar eq '�t')) {
$negative = 1;
} elsif (i == 0 && $cchar eq '��') {
# Do nothing for now
} elsif ($cchar eq '��') {
$power = 12;
$total += $leveltotal * (10 ** $power);
$leveltotal = 0;
$power -= 4;
} elsif ($cchar eq '' ||
$cchar eq '��') {
$power = 8;
$total += $leveltotal * (10** $power);
$leveltotal = 0;
$power -= 4;
} elsif ($cchar eq '' ||
$cchar eq '�U') {
$power = 4;
$total += $leveltotal * (10**$power);
$leveltotal = 0;
$power -= 4;
} elsif ($cchar eq "" ||
$cchar eq '�d') {
$leveltotal += 1000;
} elsif ($cchar eq "" ||
$cchar eq "��") {
$leveltotal += 100;
} elsif ($cchar eq "" ||
$cchar eq "�Q") {
$leveltotal += 10;
} elsif ($cchar eq "�s" ||
$cchar eq "�@" ||
$cchar eq "�G" ||
$cchar eq "�T" ||
$cchar eq "�|" ||
$cchar eq "��" ||
$cchar eq "��" ||
$cchar eq "�C" ||
$cchar eq "�K" ||
$cchar eq "�E") {
$digitval = $digits{substr($cnumber, $i, 2)};
#print "Digit val is $digitval<BR>\n";
if ($i+2 < $cnumlength) {
$nextcchar = substr($cnumber, $i+2, 2);
if ($nextcchar eq "�Q" || $nextcchar eq "") {
$leveltotal += $digitval * 10;
$i+=2;
} elsif ($nextcchar eq "��" || $nextcchar eq "") {
$leveltotal += $digitval * 100;
$i+=2;
} elsif ($nextcchar eq "�d" || $nextcchar eq "") {
$leveltotal += $digitval * 1000;
$i+=2;
} else {
$leveltotal += $digitval;
}
} else {
$leveltotal += $digitval;
}
} else {
print "Seems to be an error in the number<BR>\n";
# return negative infinity;
}
}
# Catch remaining leveltotal
#print("Level total " + $leveltotal + " power " + $power + " ten to power " + (10**$power)/10);
$total += $leveltotal * 10** $power;
if ($negative == 1) { $total = -$total; }
return $total;
}