Home | History | Annotate | Download | only in i18n
      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