Code:
#include <stdio.h>
#include <string.h>
#include <math.h>
char* GetHundreds(char* buffer, const char* num)
{
char* pbuffer = buffer;
char* Numbers[] =
{
"one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen", "eightteen",
"nineteen", "twenty", "thirty", "fourty", "fifty", "sixty",
"seventy", "eighty", "ninety"
};
if(num[0] != '0')
{
// xyz, x != 0 (ie: 100)
sprintf(pbuffer, "%s hundred ", Numbers[num[0] - '1']);
pbuffer += strlen(pbuffer);
}
if(num[1] != '0' || num[2] != '0')
{
if(num[0] != '0')
{
strcpy(pbuffer, "and ");
pbuffer += strlen(pbuffer);
}
if(num[1] == '0')
// x0z, z != 0 (ie: 101)
sprintf(pbuffer, "%s ", Numbers[num[2] - '1']);
else if(num[1] == '1')
// x1z (ie: 111)
sprintf(pbuffer, "%s ", Numbers[num[2] - '1' + 10]);
else if(num[2] != '0')
// xyz, y != 0, y != 1, z != 0 (ie: 121)
sprintf(pbuffer, "%s %s ", Numbers[num[1] - '2' + 19], Numbers[num[2] - '1']);
else
// xy0, y != 0, y != 1 (ie: 120)
sprintf(pbuffer, "%s ", Numbers[num[1] - '2' + 19]);
}
return buffer;
}
// Writes the word equivalent of Number in buffer.
// Returns buffer.
char* IntToWords(char* buffer, int Number)
{
char num[13];
char* pnum = num;
char* pbuffer = buffer;
char* Numbers[] = { "milliard ", "million ", "thousand " };
int i;
if(Number == 0)
{
strcpy(buffer, "zero");
return buffer;
}
// Check sign
if(Number < 0)
{
strcpy(pbuffer, "minus ");
pbuffer += 6;
}
sprintf(num, "%012d", abs(Number));
// milliards, millions and thousands
for(i = 0; i < 3; i++, pnum += 3)
if(pnum[0] != '0' || pnum[1] != '0' || pnum[2] != '0')
{
GetHundreds(pbuffer, pnum);
strcat(pbuffer, Numbers[i]);
pbuffer += strlen(pbuffer);
}
// hundreds
if(pnum[0] != '0' || pnum[1] != '0' || pnum[2] != '0')
GetHundreds(pbuffer, pnum);
return buffer;
}
int main()
{
char buffer[200];
int x = 1234567890;
printf("%d - %s\n", x, IntToWords(buffer, x));
return 0;
}