Code:
#include <stdio.h>
#include <string.h>
char *wordbuild ( char *n, int ncomm )
{
int i, nleft, len;
char *p = NULL;
static char ret[1024];
/* Word lists */
static char *ones[] = {"one ","two ","three ","four ",
"five ","six ","seven ","eight ","nine "};
static char *tens[] = {"ten ","eleven ","twelve ","thirteen ",
"fourteen ","fifteen ","sixteen ","seventeen ","eighteen ","nineteen "};
static char *twenties[] = {"","twenty ","thirty ","forty ",
"fifty ","sixty ","seventy ","eighty ","ninety "};
static char *hundreds[] = {
"hundred ","thousand ","million "};
memset ( ret, '\0', 1024 );
len = strlen ( n );
for ( i = 0; i < len; i++ ) {
if ( ( p = strchr ( ( n[i] == ',' ) ? &n[++i] : &n[i], ',' ) ) == NULL )
p = &n[strlen ( n )];
if ( n[i] == '0' )
continue;
if ( ( nleft = ( p - &n[i] ) ) != 0 ) {
if ( nleft == 3 ) {
strcat ( ret, ones[n[i] - '0' - 1] );
strcat ( ret, hundreds[0] );
}
else if ( nleft == 2 ) {
if ( n[i] == '1' ) {
strcat ( ret, tens[n[++i] - '0'] );
nleft--;
}
else
strcat ( ret, twenties[n[i] - '0' - 1] );
}
else
strcat ( ret, ones[n[i] - '0' - 1] );
}
if ( nleft == 1 && ncomm != 0 )
strcat ( ret, hundreds[ncomm--] );
}
return ret;
}
char *commaize ( unsigned long n, int *ncomm )
{
static char ret[30];
int i = 0;
char *p = &ret[sizeof(ret)-1];
*p = '\0';
*ncomm = 0;
do {
if ( i % 3 == 0 && i != 0 ) {
*--p = ',';
++*ncomm;
}
*--p = (char)( '0' + n % 10 );
n /= 10;
i++;
} while ( n != 0 );
return p;
}
char *stow ( int n, char *buf )
{
int i;
char *p, *ret;
p = commaize ( n, &i );
ret = wordbuild ( p, i );
if ( buf != NULL ) {
strcpy ( buf, ret );
return buf;
}
return ret;
}
int main ( void )
{
char buf[1024];
printf ( "%s\n", stow ( 123456789, NULL ) );
printf ( "%s\n", stow ( 12, NULL ) );
stow ( 23, buf );
printf ( "%s\n", buf );
return 0;
}