Inflection
Morphology Inflection
Loading...
Searching...
No Matches
NumberConcept.hpp
1/*
2 * Copyright 2017-2024 Apple Inc. All rights reserved.
3 */
4#pragma once
5
6#include <inflection/dialog/fwd.hpp>
7#include <inflection/dialog/SpeakableConcept.hpp>
8#include <inflection/util/fwd.hpp>
9#include <inflection/util/ULocale.hpp>
10#include <icu4cxx/fwd.hpp>
11#include <unicode/unum.h>
12#include <string>
13
21class INFLECTION_CLASS_API inflection::dialog::NumberConcept
22 : public virtual SpeakableConcept
23{
24public:
28
29private:
30 struct Number {
31 union {
32 int64_t int64Val;
33 double doubleVal;
34 } value;
35 enum {
36 INT64,
37 DOUBLE
38 } type;
39 };
40
41private:
42 Number value { };
44 ::inflection::util::ULocale regionLocale;
45 int32_t maximumFractionDigits { -1 };
46 int32_t minimumFractionDigits { -1 };
47 int32_t maximumIntegerDigits { -1 };
48 int32_t minimumIntegerDigits { -1 };
49 int32_t groupingUsed { -1 };
50 int32_t roundingMode { -1 };
51
52private:
53 static int64_t longValue(const ::inflection::dialog::NumberConcept::Number& value);
54 static double doubleValue(const ::inflection::dialog::NumberConcept::Number& value);
55 void copySettings(const NumberConcept& original);
56
57public:
62 virtual NumberConcept* getAbsolute() const;
63
64private:
65// ::com::ibm::icu::math::BigDecimal* toBigDecimal() const;
66// static ::inflection::dialog::NumberConcept::Number toSmallestPrimitiveType(const ::inflection::dialog::NumberConcept::Number& value);
67// Number getRoundedNumber() const;
68
69public:
70// virtual NumberConcept* getRoundedValue() const;
71
72private:
73 NumberConcept* getMutableVersion() const;
74
75public:
81 virtual NumberConcept* minFractionDigits(int32_t min) const;
82
88 virtual NumberConcept* maxFractionDigits(int32_t max) const;
89
95 virtual NumberConcept* maxFractionDigitsAboveOne(int32_t given) const;
96
100 virtual int32_t getMaximumFractionDigits() const;
101
106 virtual NumberConcept* minIntegerDigits(int32_t min) const;
107
112 virtual NumberConcept* maxIntegerDigits(int32_t max) const;
113
118 virtual NumberConcept* grouping(bool grouping) const;
119
124 virtual NumberConcept* roundUp() const;
125
130 virtual NumberConcept* roundDown() const;
131
137 virtual NumberConcept* roundHalfUp() const;
138
144 virtual NumberConcept* roundHalfDown() const;
145
150 virtual NumberConcept* roundCeiling() const;
151
156 virtual NumberConcept* roundFloor() const;
157
161 virtual bool getIsNegative() const;
162
163private:
164 static bool hasFraction(const Number& value);
165
166public:
170 virtual bool hasFraction() const;
171
172private:
173 NumberConcept* round(int32_t roundMode) const;
174
175public:
179 virtual const ::inflection::util::ULocale& getLanguage() const;
180
184 virtual const ::inflection::util::ULocale& getRegionLocale() const;
185
189 ::std::u16string toString() const override;
190
195
199 virtual ::std::u16string getAsWords() const;
200
205 virtual ::std::u16string asWords(const ::std::u16string& variant) const;
206
212
218 virtual SpeakableString asSpokenWords(const ::std::u16string& variant) const;
219
225
231 virtual ::std::u16string getAsOrdinalDigits() const;
232
238 virtual ::std::u16string asDigits(const ::std::u16string& variant) const;
239
240private:
241 ::icu4cxx::NumberFormat createSimpleNumberFormat(const ::inflection::util::ULocale& locale) const;
242 ::icu4cxx::NumberFormat* configure(::icu4cxx::NumberFormat* numberFormat) const;
243 ::std::u16string format(UNumberFormatStyle type, const ::std::u16string& variant) const;
244 ::icu4cxx::NumberFormat createRuleBasedNumberFormat(UNumberFormatStyle type) const;
245 bool isIntegral() const;
246 ::std::u16string format(const ::icu4cxx::NumberFormat& rbnf) const;
247 static ::std::u16string postProcess(const ::std::u16string& formattedValue);
248
249public:
254 bool operator==(const NumberConcept& o) const;
255
259 std::size_t operator()(const NumberConcept& o) const noexcept;
260
266 std::partial_ordering operator<=>(const NumberConcept& o) const;
267
271 int64_t longValue() const;
272
276 double doubleValue() const;
277
284 NumberConcept(int64_t value, const ::inflection::util::ULocale& language, const ::inflection::util::ULocale& regionLocale);
291 NumberConcept(double value, const ::inflection::util::ULocale& language, const ::inflection::util::ULocale& regionLocale);
295 NumberConcept(const NumberConcept& original);
296
297 ~NumberConcept() override;
298private:
299 NumberConcept& operator=(const NumberConcept&) = delete;
300};
Provides representation of numerics as lexical tokens, such as ordinals or cardinals.
virtual NumberConcept * roundCeiling() const
virtual NumberConcept * getAbsolute() const
virtual int32_t getMaximumFractionDigits() const
virtual NumberConcept * roundFloor() const
bool operator==(const NumberConcept &o) const
virtual const ::inflection::util::ULocale & getRegionLocale() const
virtual const ::inflection::util::ULocale & getLanguage() const
virtual bool getIsNegative() const
virtual NumberConcept * maxFractionDigitsAboveOne(int32_t given) const
virtual SpeakableString asSpokenWords(const ::std::u16string &variant) const
virtual ::std::u16string getAsWords() const
virtual NumberConcept * maxIntegerDigits(int32_t max) const
virtual NumberConcept * roundDown() const
virtual NumberConcept * maxFractionDigits(int32_t max) const
virtual ::std::u16string asWords(const ::std::u16string &variant) const
NumberConcept(const NumberConcept &original)
virtual NumberConcept * roundHalfDown() const
virtual ::std::u16string getAsOrdinalDigits() const
virtual NumberConcept * minIntegerDigits(int32_t min) const
NumberConcept(int64_t value, const ::inflection::util::ULocale &language, const ::inflection::util::ULocale &regionLocale)
virtual bool hasFraction() const
SpeakableString * toSpeakableString() const override
virtual ::std::u16string asDigits(const ::std::u16string &variant) const
std::partial_ordering operator<=>(const NumberConcept &o) const
::std::u16string toString() const override
virtual NumberConcept * roundUp() const
std::size_t operator()(const NumberConcept &o) const noexcept
NumberConcept(double value, const ::inflection::util::ULocale &language, const ::inflection::util::ULocale &regionLocale)
virtual SpeakableString getAsSpokenWords() const
virtual NumberConcept * minFractionDigits(int32_t min) const
virtual SpeakableString getAsDigits() const
virtual NumberConcept * grouping(bool grouping) const
virtual NumberConcept * roundHalfUp() const
The base interface for all concepts that can be formatted to a SpeakableString.
Represents a string with both a spoken and written representation.
An object that represents a specific geographical, political, or cultural region.
Definition ULocale.hpp:83
The C++ namespace for Inflection.
Definition fwd.hpp:11