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