1 // © 2017 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3
4 #include "unicode/utypes.h"
5
6 #if !UCONFIG_NO_FORMATTING
7
8 #include "unicode/numberformatter.h"
9 #include "number_types.h"
10
11 using namespace icu;
12 using namespace icu::number;
13 using namespace icu::number::impl;
14
15
scientific()16 ScientificNotation Notation::scientific() {
17 // NOTE: ISO C++ does not allow C99 designated initializers.
18 ScientificSettings settings;
19 settings.fEngineeringInterval = 1;
20 settings.fRequireMinInt = false;
21 settings.fMinExponentDigits = 1;
22 settings.fExponentSignDisplay = UNUM_SIGN_AUTO;
23 NotationUnion union_;
24 union_.scientific = settings;
25 return {NTN_SCIENTIFIC, union_};
26 }
27
engineering()28 ScientificNotation Notation::engineering() {
29 ScientificSettings settings;
30 settings.fEngineeringInterval = 3;
31 settings.fRequireMinInt = false;
32 settings.fMinExponentDigits = 1;
33 settings.fExponentSignDisplay = UNUM_SIGN_AUTO;
34 NotationUnion union_;
35 union_.scientific = settings;
36 return {NTN_SCIENTIFIC, union_};
37 }
38
ScientificNotation(int8_t fEngineeringInterval,bool fRequireMinInt,impl::digits_t fMinExponentDigits,UNumberSignDisplay fExponentSignDisplay)39 ScientificNotation::ScientificNotation(int8_t fEngineeringInterval, bool fRequireMinInt,
40 impl::digits_t fMinExponentDigits,
41 UNumberSignDisplay fExponentSignDisplay) {
42 ScientificSettings settings;
43 settings.fEngineeringInterval = fEngineeringInterval;
44 settings.fRequireMinInt = fRequireMinInt;
45 settings.fMinExponentDigits = fMinExponentDigits;
46 settings.fExponentSignDisplay = fExponentSignDisplay;
47 NotationUnion union_;
48 union_.scientific = settings;
49 *this = {NTN_SCIENTIFIC, union_};
50 }
51
compactShort()52 Notation Notation::compactShort() {
53 NotationUnion union_;
54 union_.compactStyle = CompactStyle::UNUM_SHORT;
55 return {NTN_COMPACT, union_};
56 }
57
compactLong()58 Notation Notation::compactLong() {
59 NotationUnion union_;
60 union_.compactStyle = CompactStyle::UNUM_LONG;
61 return {NTN_COMPACT, union_};
62 }
63
simple()64 Notation Notation::simple() {
65 return {};
66 }
67
68 ScientificNotation
withMinExponentDigits(int32_t minExponentDigits) const69 ScientificNotation::withMinExponentDigits(int32_t minExponentDigits) const {
70 if (minExponentDigits >= 1 && minExponentDigits <= kMaxIntFracSig) {
71 ScientificSettings settings = fUnion.scientific;
72 settings.fMinExponentDigits = static_cast<digits_t>(minExponentDigits);
73 NotationUnion union_ = {settings};
74 return {NTN_SCIENTIFIC, union_};
75 } else {
76 return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
77 }
78 }
79
80 ScientificNotation
withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const81 ScientificNotation::withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const {
82 ScientificSettings settings = fUnion.scientific;
83 settings.fExponentSignDisplay = exponentSignDisplay;
84 NotationUnion union_ = {settings};
85 return {NTN_SCIENTIFIC, union_};
86 }
87
88 #endif /* #if !UCONFIG_NO_FORMATTING */
89