If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.
If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?
NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.
<?php
class NumberOfLetters {
function __construct () {
// Start Timer
$Timer1 = new CalcTimer;
$Timer1 -> StartTimer();
// recursive
// not an official source, but I used it for reference --> http://en.wikipedia.org/wiki/English_numerals
for ($number = 1; $number <= 1000; $number++)
{
$string .= $this->translateToWords($number);
}
$answer = strlen($string);
echo "<h3>There are $answer letters used for writing out 1 to 1000 in words.</h3>";
// Stop Timer
$Timer1 -> StopTimer();
}
// A recursive function to turn digits into words
// Numbers must be integers from one to one thousand inclussive.
// Could save time (about 3/1000th seconds) by removing error checking for $number
function translateToWords($number) {
if ($number >=1 && $number <= 1000 && is_int($number)) {
switch ($number)
{
// set up some rules for converting digits to words
case 1:
$string = "one";
break;
case 2:
$string = "two";
break;
case 3:
$string = "three";
break;
case 4:
$string = "four";
break;
case 5:
$string = "five";
break;
case 6:
$string = "six";
break;
case 7:
$string = "seven";
break;
case 8:
$string = "eight";
break;
case 9:
$string = "nine";
break;
case 10:
$string = "ten";
break;
case 11:
$string = "eleven";
break;
case 12:
$string = "twelve";
break;
case 13:
$string = "thirteen";
break;
// fourteen handled later
case 15:
$string = "fifteen";
break;
case $number < 20:
$string = $this->translateToWords($number%10);
// eighteen only has one "t"
if ($number == 18)
{
$suffix = "een";
} else
{
$suffix = "teen";
}
$string .= $suffix;
break;
case 20:
$string = "twenty";
break;
case 30:
$string = "thirty";
break;
case 40:
$string = "forty";
break;
case 50:
$string = "fifty";
break;
case 60:
$string = "sixty";
break;
case 70:
$string = "seventy";
break;
case 80:
$string = "eighty";
break;
case 90:
$string = "ninety";
break;
case $number < 100:
$prefix = $this->translateToWords($number-$number%10);
$suffix = $this->translateToWords($number%10);
// add "-" to make look pretty
$string = $prefix . $suffix;
break;
case 1000:
// add space after one to make look pretty
$string = "onethousand";
break;
// handles all number 100 to 999
default:
// floor return a float not an integer
// add space before hundred to make look pretty
$prefix = $this->translateToWords(intval(floor($number/100))) . "hundred";
// add space before and after and to make look pretty
if ($number%100) $suffix = "and" . $this->translateToWords($number%100);
$string = $prefix . $suffix;
}
} else
{
echo "ERROR with - $number<br/> Number must be an integer between 1 and 1000 inclussive";
}
return $string;
}
}
?>