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 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 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 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 52 Notation Notation::compactShort() { 53 NotationUnion union_; 54 union_.compactStyle = CompactStyle::UNUM_SHORT; 55 return {NTN_COMPACT, union_}; 56 } 57 58 Notation Notation::compactLong() { 59 NotationUnion union_; 60 union_.compactStyle = CompactStyle::UNUM_LONG; 61 return {NTN_COMPACT, union_}; 62 } 63 64 Notation Notation::simple() { 65 return {}; 66 } 67 68 ScientificNotation 69 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 81 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