85 lines
1.7 KiB
C++
85 lines
1.7 KiB
C++
#include "say.h"
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <iostream>
|
|
|
|
namespace say {
|
|
|
|
using namespace std;
|
|
|
|
namespace {
|
|
|
|
const unordered_map<number_t, string> 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);
|
|
}
|
|
|
|
|
|
}
|