#include "stdafx.h"
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
using namespace std;
bool testcharacter(string input);
bool checkZero(string input);
bool checkSpace(string input);
int main()
{
string numStr;// for user entered number
// names for use in output
string onesName[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
string teensName[] = { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
string tensName[] = { "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
string illion_preName[] = { "m", "b", "tr", "quadr", "quint", "sext"};
char repeat = 'y';
bool t; // check minus number
bool cp =true;
do// as long as user wishes to enter number for naming
{
// input number
do
{
cout << "Number = ";
fflush(stdin);
getline(cin,numStr);
}while(!testcharacter(numStr) || !checkSpace(numStr));
// long long int = 2^63 ~ e20
if( numStr.size() > 24 )
{
cout << "The number's too big! Please try again." << endl;
continue;
}
// minus number
if (numStr[0] =='-')
{
t = false;
numStr = numStr.erase(0,1);
}
// delete prefix - zero
while(numStr[0] == '0' && numStr.size()>1)
{
numStr = numStr.erase(0,1);
}
// if input is zero.
if (checkZero(numStr) == true && numStr[0] !='-')
{
cout<<"zero ";
t = true;
}
// oop it's minus number, right?
if (t==false)
{
cout<<"minus ";
t = true;
}
// pad the string with leading '0' until size = multiple of 3
while( numStr.size()%3 != 0 )
numStr = '0' + numStr;
// for each group of 3 digits from most to least significant
for( unsigned int i = 0; i < numStr.size(); i += 3 )
{
cp = true; // flag to set if number is 10000000000....
if((numStr[i+0]=='0') && (numStr[i+1]=='0') && (numStr[i+2] == '0'))
{
cp = false;
}
else
{
// treat the hundreds place
if( numStr[i + 0] > '0' )
{
cout << onesName[ numStr[i + 0] - '0' - 1 ] << " hundred ";
}
// treat tens and ones digits for non-teens case
if( numStr[i + 1] == '0' || numStr[i + 1] > '1' )
{
if( numStr[i + 1] > '1' )
{
cout << tensName[ numStr[i + 1] - '0' - 2 ] << " ";
}
if( numStr[i + 2] > '0' )
{
cout << onesName[ numStr[i + 2] - '0' - 1 ] << " ";
}
}
// treat teens case
if(numStr[i+1] =='1')
{
cout << teensName[ numStr[i + 2] - '0' ] << " ";
}
}
// take 3 digits each time.
unsigned int j = ( numStr.size() - i )/3;
// treat thousand.
if( j == 2 && cp==true)
{
cout << "thousand, ";
}
// treat more ..illion
else if( j > 2 && cp == true)
{
cout << illion_preName[ j - 3 ]; //prefix
cout << "illion, "; // suffix
}
}
cout << endl << "Repeat? (y/n): ";
cin >> repeat;
}while( repeat == 'y' );
cout << endl;
return 0;
}
// check any whitespace in String.
bool checkSpace(string input)
{
bool ret = true;
for(unsigned int i=0;i<input.size();i++)
{
if(input[i]==' ')
{
ret = false;break;
}
}
return ret;
}
// check if wrong input format.
bool testcharacter(string input)
{
bool ret = true;
for(unsigned int i=0;i<input.size();i++)
{
if(!isdigit(input[i]) && input[0]!='-')
{
ret = false; break;
}
}
return ret;
}
// check if input zero
bool checkZero(string input)
{
bool ret = true;
for(unsigned int i=0;i<input.size();i++)
{
if(input[i] != '0')
{
ret = false;
break;
}
else ret = true;
}
return ret;
}