KGRKJGETMRETU895U-589TY5MIGM5JGB5SDFESFREWTGR54TY
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /domains/mandarintools/cgi-bin/numbers.pl
#!/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;
}

Anon7 - 2021