#include "say.h" #include #include namespace say { using namespace std; namespace { const unordered_map numbers_map = { {0, "zero"}, {1, "one"}, {2, "two"}, {3, "three"}, {4, "four"}, {5, "five"}, {6, "six"}, {7, "seven"}, {8, "eight"}, {9, "nine"}, {10, "ten"}, {11, "eleven"}, {12, "twelve"}, {13, "thirteen"}, {20, "twenty"}, {30, "thirty"}, {50, "fifty"}, {80, "eighty"} }; } string in_english(number_t number) { if (number > 13 && number < 20) return numbers_map.at(number - 10) + "teen"; if (number >= 20 && number < 100 && (number % 10 == 0)) { if (numbers_map.count(number)) return numbers_map.at(number); return numbers_map.at(number / 10) + "ty"; } if (number > 20 && number < 100) { number_t ones = number % 10; number_t tens = number - ones; return in_english(tens) + '-' + in_english(ones); } if (number >= 100 && number < 1000) { if (number % 100 == 0) return in_english(number / 100) + " hundred"; number_t rest = number % 100; number_t hundreds = number - rest; return in_english(hundreds) + ' ' + in_english(rest); } if (number >= 1000 && number < 1000000) { cout << number << endl; if (number % 1000 == 0) return in_english(number / 1000) + " thousand"; number_t rest = number % 1000; number_t thousands = number - rest; return in_english(thousands) + ' ' + in_english(rest); } return numbers_map.at(number); } }