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 && !UPRV_INCOMPLETE_CPP11_SUPPORT
      7 
      8 #include "unicode/numberformatter.h"
      9 #include "number_patternstring.h"
     10 
     11 using namespace icu;
     12 using namespace icu::number;
     13 using namespace icu::number::impl;
     14 
     15 Grouper Grouper::defaults() {
     16     return {-2, -2, false};
     17 }
     18 
     19 Grouper Grouper::minTwoDigits() {
     20     return {-2, -2, true};
     21 }
     22 
     23 Grouper Grouper::none() {
     24     return {-1, -1, false};
     25 }
     26 
     27 void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo) {
     28     if (fGrouping1 != -2) {
     29         return;
     30     }
     31     auto grouping1 = static_cast<int8_t> (patternInfo.positive.groupingSizes & 0xffff);
     32     auto grouping2 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff);
     33     auto grouping3 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff);
     34     if (grouping2 == -1) {
     35         grouping1 = -1;
     36     }
     37     if (grouping3 == -1) {
     38         grouping2 = grouping1;
     39     }
     40     fGrouping1 = grouping1;
     41     fGrouping2 = grouping2;
     42 }
     43 
     44 bool Grouper::groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const {
     45     U_ASSERT(fGrouping1 > -2);
     46     if (fGrouping1 == -1 || fGrouping1 == 0) {
     47         // Either -1 or 0 means "no grouping"
     48         return false;
     49     }
     50     position -= fGrouping1;
     51     return position >= 0 && (position % fGrouping2) == 0
     52            && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= (fMin2 ? 2 : 1);
     53 }
     54 
     55 #endif /* #if !UCONFIG_NO_FORMATTING */
     56