How can we write a shortest program in c to convert given number to
words format. example input 5012 Output: five thousand tewlve.
I've posted this here several times before. I have a version for
Japanese too if you want that.
#include <stdio.h>
#include <stdlib.h>
char *ordinal (char buf[1024], int value);
int
main (int argc, char *argv[])
{
char buf[1024];
if (argc != 2)
{
printf ("usage: ordinal <number>\n");
return EXIT_FAILURE;
}
ordinal (buf, atoi (argv[1]));
puts (buf);
return EXIT_SUCCESS;
}
/* Works for positive and negative numbers up to 9 digits long,
if you speak American English. */
char *
ordinal (char buf[1024], int value)
{
static const char *const powers[]
= {"thousand", "million", "billion"};
static const char *const ones[]
= {"one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "nineteen"};
static const char *const tens[]
= {"twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"};
char *cp = buf;
if (value < 0)
{
cp += sprintf (cp, "negative ");
value = -value;
}
else if (value == 0)
{
strcpy (buf, "zero");
return buf;
}
{
int part_stack[4];
int *part_ptr = part_stack;
for (; value; value /= 1000)
*part_ptr++ = value % 1000;
while (part_ptr > part_stack)
{
int p = *--part_ptr;
if (p >= 100)
{
cp += sprintf (cp, "%s hundred ", ones[p / 100 - 1]);
p %= 100;
}
if (p >= 20)
{
if (p % 10)
cp += sprintf (cp, "%s-%s ", tens[p / 10 - 2], ones[p % 10 - 1]);
else
cp += sprintf (cp, "%s ", tens[p / 10 - 2]);
}
else if (p > 0)
cp += sprintf (cp, "%s ", ones[p - 1]);
if (p && part_ptr > part_stack)
cp += sprintf (cp, "%s ", powers[part_ptr - part_stack - 1]);
}
}
cp[-1] = 0;
return buf;
}
/*
Local variables:
compile-command: "gcc -W -Wall -ansi -pedantic ordinal.c -o ordinal"
End:
*/