This is a simple program to convert a number, from 0 up to 99999999, to English words.
Example:
If the input is:
1234
The output would be:
one thousand two hundred thirty four
I would like to get feedback regarding this small program.
#include <iostream>
#include <vector>
#include <string>
const std::vector<std::string> words[] =
{
{
"",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen",
"sixteen",
"seventeen",
"eighteen",
"nineteen"
},
{
"-",
"-",
"twenty -",
"thirty -",
"forty -",
"fifty -",
"sixty -",
"seventy -",
"eighty -",
"ninety -"
},
{
"million",
"hundred",
"thousand",
"hundred",
""
},
};
class NumberConvertor
{
public:
NumberConvertor(std::size_t number);
friend std::ostream& operator<< (std::ostream& out, const NumberConvertor& nc);
private:
void convert(std::size_t unit, const std::string& units);
std::size_t mNumber;
std::string mResult;
std::size_t mIterator;
std::size_t mSwap;
};
NumberConvertor::NumberConvertor(std::size_t number)
: mNumber(number), mIterator(0), mSwap(0)
{
if (mNumber == 0)
{
mResult = "zero";
}
else
{
convert( 1000000, words[2][0]);
}
}
void NumberConvertor::convert(std::size_t unit, const std::string& units)
{
std::size_t index = mNumber / (unit * 10);
std::size_t sub = (index > 1 ? index * unit * 10 : 0);
std::string word = words[1][index];
if (word[word.size() - 1] == '-')
{
word.erase(word.size() - 1);
index = (mNumber-sub) / unit;
word.append(words[0][index]);
}
if (word != "")
{
std::size_t x = mNumber / 1000;
switch(x)
{
case 100:
case 200:
case 300:
case 400:
case 500:
case 600:
case 700:
case 800:
case 900:
{
mResult.append( word + ' ' + units + ' ' + words[2][mIterator + 1] + ' ');
break;
}
default:
{
mResult.append( word + ' ' + units + ' ');
}
};
}
mNumber -= mNumber / unit * unit;
if( ++mIterator < words[2].size())
{
mSwap ^= 1;
if(unit == 1)
{
convert( 1, words[2][0]);
}
convert( unit / (mSwap == 0 ? 100 : 10), words[2][mIterator]);
}
}
std::ostream& operator<< (std::ostream& out, const NumberConvertor& nc)
{
return out << nc.mResult;
}
int readInput(const std::string& prompt)
{
int answer;
while((std::cout << prompt) && (!(std::cin >> answer) || answer < 0 || answer > 99999999))
{
std::cout << "Enter a positive number between 0 - 99999999\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return answer;
}
int main()
{
while(1) // (ctrl c) to exit
{
std::cout << NumberConvertor(readInput("Enter the number: ")) << '\n';
}
}