Sha256: 251be9c1ff4a98f7a7b03d6206633cd4ac0dedec2eaf4aa015074d0499b1c452

Contents?: true

Size: 1.88 KB

Versions: 396

Compression:

Stored size: 1.88 KB

Contents

#include "say.h"
#include <iterator>
#include <sstream>
#include <stdexcept>

using namespace std;

namespace
{

const string singles_and_teens_names[] =
{
    "zero", "one", "two", "three", "four",
    "five", "six", "seven", "eight", "nine",
    "ten", "eleven", "twelve", "thirteen", "fourteen",
    "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
};

const string tens_names[] =
{
    "twenty", "thirty", "forty", "fifty", "sixty",
    "seventy", "eighty", "ninety"
};

typedef unsigned long long number_t;

const number_t twenty{20ULL};
const number_t one_hundred{100ULL};
const number_t one_thousand{1000ULL};
const number_t one_million{one_thousand*one_thousand};
const number_t one_billion{one_thousand*one_million};
const number_t one_trillion{one_thousand*one_billion};

struct 
{
    number_t threshold;
    string name;
}
const units[] =
{
    { one_billion, "billion" },
    { one_million, "million" },
    { one_thousand, "thousand" },
    { one_hundred, "hundred" }
};

void in_english(ostream& english, number_t number)
{
    for (auto unit : units) {
        if (number >= unit.threshold) {
            in_english(english, number/unit.threshold);
            english << ' ' << unit.name;
            number %= unit.threshold;

            if (!number) {
                return;
            }
            english << ' ';
        }
    }

    if (number >= twenty) {
        const number_t tens{number/10ULL - 2ULL};
        english << tens_names[tens];

        if (const number_t single{number % 10ULL}) {
            english << '-' << singles_and_teens_names[single];
        }
    } else {
        english << singles_and_teens_names[number];
    }
}

}

namespace say
{

string in_english(number_t number)
{
    if (number >= one_trillion) {
        throw std::domain_error("argument out of range");
    }

    ostringstream english;
    ::in_english(english, number);
    return english.str();
}

}

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.179 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.178 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.177 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.176 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.175 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.174 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.173 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.172 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.171 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.170 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.169 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.167 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.166 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.165 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.164 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.163 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.162 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.161 tracks/cpp/exercises/say/example.cpp
trackler-2.2.1.160 tracks/cpp/exercises/say/example.cpp