1ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert// © 2017 and later: Unicode, Inc. and others. 2ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 4ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "unicode/utypes.h" 5ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 6ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT 7ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 8ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "unicode/numberformatter.h" 9ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "number_patternstring.h" 10ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 11ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertusing namespace icu; 12ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertusing namespace icu::number; 13ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertusing namespace icu::number::impl; 14ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 15ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertGrouper Grouper::defaults() { 16ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert return {-2, -2, false}; 17ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert} 18ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 19ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertGrouper Grouper::minTwoDigits() { 20ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert return {-2, -2, true}; 21ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert} 22ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 23ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertGrouper Grouper::none() { 24ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert return {-1, -1, false}; 25ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert} 26ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 27ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertvoid Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo) { 28ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert if (fGrouping1 != -2) { 29ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert return; 30ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert } 31ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert auto grouping1 = static_cast<int8_t> (patternInfo.positive.groupingSizes & 0xffff); 32ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert auto grouping2 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff); 33ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert auto grouping3 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff); 34ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert if (grouping2 == -1) { 35ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert grouping1 = -1; 36ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert } 37ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert if (grouping3 == -1) { 38ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert grouping2 = grouping1; 39ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert } 40ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert fGrouping1 = grouping1; 41ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert fGrouping2 = grouping2; 42ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert} 43ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 44ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertbool Grouper::groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const { 45ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert U_ASSERT(fGrouping1 > -2); 46ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert if (fGrouping1 == -1 || fGrouping1 == 0) { 47ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert // Either -1 or 0 means "no grouping" 48ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert return false; 49ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert } 50ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert position -= fGrouping1; 51ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert return position >= 0 && (position % fGrouping2) == 0 52ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= (fMin2 ? 2 : 1); 53ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert} 54ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 55ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#endif /* #if !UCONFIG_NO_FORMATTING */ 56