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
11using namespace icu;
12using namespace icu::number;
13using namespace icu::number::impl;
14
15
16ScientificNotation 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
28ScientificNotation 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
39ScientificNotation::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
52Notation Notation::compactShort() {
53 NotationUnion union_;
54 union_.compactStyle = CompactStyle::UNUM_SHORT;
55 return {NTN_COMPACT, union_};
56}
57
58Notation Notation::compactLong() {
59 NotationUnion union_;
60 union_.compactStyle = CompactStyle::UNUM_LONG;
61 return {NTN_COMPACT, union_};
62}
63
64Notation Notation::simple() {
65 return {};
66}
67
68ScientificNotation
69ScientificNotation::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
80ScientificNotation
81ScientificNotation::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