Convert a number into a string of words

By | December 17, 2015

Question: Given an integer N, convert it into a string of words.
Input: N = 345
Output: three hundred forty five

This is one of the most common problems that we come across in out daily lives. We need to input a number from the user and print it in words.

First, we perform a number of checks on the input string. If it is in any way invalid, the result is the empty string (“”).

Next, we take note of whether or not the string begins with a ‘-‘. If it does we remove it.

If what is left is composed entirely of zeros, we just return “zero”.
The number can then be processed taking each digit at a time and evaluating it.
I have added comments in the code for a better understanding of the algorithm.

/* Program to print a given number in words. The program handles
   numbers from 0 to 9999 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

/* A function that prints given number in words */
void convert_to_words(char *num)
{
    int len = strlen(num);  // Get number of digits in given number

    /* Base cases */
    if (len == 0) {
        fprintf(stderr, "empty string\n");
        return;
    }
    if (len > 4) {
        fprintf(stderr, "Length more than 4 is not supported\n");
        return;
    }

    /* The first string is not used, it is to make array indexing simple */
    string single_digits[] = { "zero", "one", "two", "three", "four",
                              "five", "six", "seven", "eight", "nine"};

    /* The first string is not used, it is to make array indexing simple */
    string two_digits[] = {"", "ten", "eleven", "twelve", "thirteen", "fourteen",
                     "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};

    /* The first two string are not used, they are to make array indexing simple*/
    string tens_multiple[] = {"", "", "twenty", "thirty", "forty", "fifty",
                             "sixty", "seventy", "eighty", "ninety"};

    string tens_power[] = {"hundred", "thousand"};

    /* Used for debugging purpose only */
    printf("\n%s: ", num);

    /* For single digit number */
    if (len == 1) {
        cout << single_digits[*num - '0'] << " ";
        return;
    }

     /* Iterate while num is not '\0' */
     while (*num != '\0') {

        /* Code path for first 2 digits */
        if (len >= 3) {
            if (*num -'0' != 0) {
                cout << single_digits[*num - '0'] << " ";
                cout << tens_power[len-3] << " "; // here len can be 3 or 4
            }
            --len;
        }

        /* Code path for last 2 digits */
        else {
            /* Need to explicitly handle 10-19. Sum of the two digits is
               used as index of "two_digits" array of strings */
            if (*num == '1') {
                int sum = *num - '0' + *(num + 1)- '0';
                cout << two_digits[sum] << " ";
                return;
            }

            /* Need to explicitely handle 20 */
            else if (*num == '2' && *(num + 1) == '0') {
                cout << "twenty ";
                return;
            }

            /* Rest of the two digit numbers i.e., 21 to 99 */
            else {
                int i = *num - '0';
                cout << (i? tens_multiple[i]: "") << " ";
                ++num;
                if (*num != '0')
                    cout << single_digits[*num - '0'] << " ";
            }
        }
        ++num;
    }
}

/* Driver program to test above function */
int main(void)
{
    cout << "Enter a number to convert to words:- ";

    char num[10];

    cin >> num;
    convert_to_words(num);

    cout << endl;

    return 0;
}

Here is the running link of the code:- http://ideone.com/p6aUvz

5 thoughts on “Convert a number into a string of words

  1. Akilan

    You’re code is great. I have one doubt. There is no check being done for signed number or invalid input string. Why?

    Reply
    1. nikoo28 Post author

      Hi Akilan,

      I understand your doubt, but this is not a homework question that takes care of invalid input. The problem concentrates specifically on the logic of the problem.

      Reply
  2. Rajesh

    can u explain the logic? I understood when the string contains only single character.

    Reply

Enclose codes in [code lang="C"] [/code] tags

This site uses Akismet to reduce spam. Learn how your comment data is processed.