| px | top | add code | search | signup | login | help |
<?php
/*******************************************************
* WRITTEN AMOUNT, spanish languaje conversion script *
* *
* This can be used as pseudocode for porting to other *
* languajes. The script will convert an amount between *
* 0 and 999,999,999 to a spanish wirtten amount which *
* is sintactically correct and handles special cases *
* in spanish *
* *
* Written by: Hector Lecuanda *
* hector.lecuanda@driessenusa.com *
* Language: php 3 *
* Version 1.0 *
* Date: September 1st 1999 *
* *
*******************************************************/
// function mod (modulus) is basically self explanatory. It returns the reminder
// of a division.
function mod($a , $b) {
$c = $a / $b ;
$whole_part = floor($c); // this line gets you the integer part of the quotient
$fraction_part = $c - $whole_part ; // this line gets you the fractional part of the quotient
$modulus = round($fraction_part * $b); // this line gives you the modulus (fraction times divisor)
return $modulus;
} // end of function integer_part() ============================================
// function whole_part returns the whole part of a quotient
function whole_part($a , $b) {
$c = $a / $b ;
$w_part = floor($c);
return $w_part;
} //end of function mod() ======================================================
// function fraction part, returns the fractional part of a quotient
function fraction_part($a , $b) {
$c = $a / $b ;
$f_part = floor($c);
return $f_part;
} //end of function mod() ======================================================
// function string_literal conversion is the core of this program
// converts numbers to spanish strings, handling the general special
// cases in spanish language.
function string_literal_conversion($number) {
// first, divide your number in hundreds, tens and units, cascadig
// trough subsequent divisions, using the modulus of each division
// for the next.
$hundreds = whole_part($number, 100);
$number = mod($number, 100);
$tens = whole_part($number, 10);
$number = mod($number, 10);
$units = whole_part($number, 1);
$number = mod($number, 1);
/* uncomment for debugging
print('hundreds : '.$hundreds. '<br>');
print('tens : '.$tens. '<br>');
print('units : '.$units. '<br><hr>');
*/
// cascade trough hundreds. This will convert the hundreds part to
// their corresponding string in spanish.
switch ($hundreds) {
case 1: $string_hundreds = "ciento "; break; // Special case
case 2: $string_hundreds = "doscientos "; break;
case 3: $string_hundreds = "trescientos "; break;
case 4: $string_hundreds = "cuatrocientos "; break;
case 5: $string_hundreds = "quinientos "; break; // Special case
case 6: $string_hundreds = "seiscientos "; break;
case 7: $string_hundreds = "setecientos "; break; // Special case
case 8: $string_hundreds = "ochocientos "; break;
case 9: $string_hundreds = "novecientos "; break; // Special case
} // end switch hundreds
// casgade trough tens. This will convert the tens part to corresponding
// strings in spanish. Note, however that the strings between 11 and 19
// are all special cases. Also 21-29 is a special case in spanish.
switch ($tens) {
case 1: // Special case, depends on units for each conversion
switch($units){
case 1: $string_tens = "once"; break; // Special case
case 2: $string_tens = "doce"; break; // Special case
case 3: $string_tens = "trece"; break; // Special case
case 4: $string_tens = "catorce"; break; // Special case
case 5: $string_tens = "quince"; break; // Special case
case 6: $string_tens = "dieciseis"; break; // Special case
case 7: $string_tens = "diecisiete"; break; // Special case
case 8: $string_tens = "dieciocho"; break; // Special case
case 9: $string_tens = "diecinueve"; break; // Special case
} break; // end switch special case tens/units
case 2: $string_tens = "veinti"; break; // Special case
case 3: $string_tens = "treinta"; break;
case 4: $string_tens = "cuarenta"; break;
case 5: $string_tens = "cincuenta"; break;
case 6: $string_tens = "sesenta"; break;
case 7: $string_tens = "setenta"; break;
case 8: $string_tens = "ochenta"; break;
case 9: $string_tens = "noventa"; break;
} // end switch tens
// cascades trough units, This will convert the units part to corresponding
// strings in spanish. Note however that a check is being made to see wether
// the special cases 11-19 were used. In that case, the whole conversion of
// individual units is ignored since it was already made in the tens cascade.
if ($tens == 1) {
$string_units=""; // empties the units check, since it has alredy been handled on the tens switch
} else {
switch ($units) {
case 1: $string_units = "un"; break;
case 2: $string_units = "dos"; break;
case 3: $string_units = "tres"; break;
case 4: $string_units = "cuatro"; break;
case 5: $string_units = "cinco"; break;
case 6: $string_units = "seis"; break;
case 7: $string_units = "siete"; break;
case 8: $string_units = "ocho"; break;
case 9: $string_units = "nueve"; break;
} // end switch units
} // end if-then-else
//final special cases. This conditions will handle the special cases which
//are not as general as the ones in the cascades. Basically four:
// when you've got 100, you dont' say 'ciento' you say 'cien'
// 'ciento' is used only for [101 >= number > 199]
if ($hundreds == 1 and $tens == 0 and $units == 0) {
$string_hundreds = "cien" ;
}
// when you've got 10, you don't say any of the 11-19 special
// cases.. just say 'diez'
if ($tens == 1 and $units ==0) {
$string_tens = "diez" ;
}
// when you've got 20, you don't say 'veinti', which is used
// only for [21 >= number > 29]
if ($tens == 2 and $units ==0) {
$string_tens = "veinte" ;
}
// for numbers >= 30, you don't use a single word such as veintiuno
// (twenty one), you must add 'y' (and), and use two words. v.gr 31
// 'treinta y uno' (thirty and one)
if ($tens >=3 and $units >=1) {
$string_tens = $string_tens." y ";
}
// this line gathers all the hundreds, tens and units into the final string
// and returns it as the function value.
$final_string = $string_hundreds.$string_tens.$string_units;
return $final_string ;
} //end of function string_literal_conversion()================================
/***************************
* MAIN PROGRAM STARTS HERE *
***************************/
// this echoes the input form to the browser
echo 'Please enter a number between 999,999,999 and 0';
echo '<FORM METHOD=POST ACTION="./stringcon.php3">';
echo '<INPUT TYPE="text" NAME="number" VALUE="'.$number.'">';
echo '<INPUT TYPE="submit"><INPUT TYPE="reset">';
echo '</FORM>';
echo '<p><p><p><p><p>';
echo 'Translated number to spanish: <p>';
// handle some external special cases. Specially the millions, thousands
// and hundreds descriptors. Since the same rules apply to all number triads
// descriptions are handled outside the string conversion function, so it can
// be re used for each triad.
if ($number == 0) { // if amount = 0, then forget all about conversions,
$hundreds_final_string=" cero "; // amount is zero (cero). handle it externally, to
// function breakdown
} else {
$millions = whole_part($number, 1000000); // first, send the millions to the string
$number = mod($number, 1000000); // conversion function
if ($millions != 0) { // This condition handles the plural case
if ($millions == 1) { // if only 1, use 'millon' (million). if
$descriptor= " millon, "; // > than 1, use 'millones' (millions) as
} else { // a descriptor for this triad.
$descriptor = " millones, ";
}
} else {
$descriptor = " "; // if 0 million then use no descriptor.
}
$millions_final_string = string_literal_conversion($millions).$descriptor;
$thousands = whole_part($number, 1000); // now, send the thousands to the string
$number = mod($number, 1000); // conversion function.
if ($thousands != 0) { // This condition eliminates the descriptor
$descriptor = " mil, "; // if there are no thousands on the amount
} else {
$descriptor= " ";
}
$thousands_final_string =string_literal_conversion($thousands) .$descriptor;
// this will handle numbers between 1 and 999 which
// need no descriptor whatsoever.
$hundreds = $number;
$hundreds_final_string = string_literal_conversion($hundreds) ;
} //end if ($number ==0)
//finally, print the output.
print "<b>".$millions_final_string.$thousands_final_string.$hundreds_final_string ."</b>" ;
// that's it.
?>
Comments or questions?
PX is running PHP 5.2.11
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.