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