int32_t Padder::padAndApply(const Modifier &mod1, const Modifier &mod2, NumberStringBuilder &string, int32_t leftIndex, int32_t rightIndex, UErrorCode &status) const { int32_t modLength = mod1.getCodePointCount(status) + mod2.getCodePointCount(status); int32_t requiredPadding = fWidth - modLength - string.codePointCount(); U_ASSERT(leftIndex == 0 && rightIndex == string.length()); // fix the previous line to remove this assertion int length = 0; if (requiredPadding <= 0) { // Padding is not required. length += mod1.apply(string, leftIndex, rightIndex, status); length += mod2.apply(string, leftIndex, rightIndex + length, status); return length; } PadPosition position = fUnion.padding.fPosition; UChar32 paddingCp = fUnion.padding.fCp; if (position == UNUM_PAD_AFTER_PREFIX) { length += addPaddingHelper(paddingCp, requiredPadding, string, leftIndex, status); } else if (position == UNUM_PAD_BEFORE_SUFFIX) { length += addPaddingHelper(paddingCp, requiredPadding, string, rightIndex + length, status); } length += mod1.apply(string, leftIndex, rightIndex + length, status); length += mod2.apply(string, leftIndex, rightIndex + length, status); if (position == UNUM_PAD_BEFORE_PREFIX) { length += addPaddingHelper(paddingCp, requiredPadding, string, leftIndex, status); } else if (position == UNUM_PAD_AFTER_SUFFIX) { length += addPaddingHelper(paddingCp, requiredPadding, string, rightIndex + length, status); } return length; }
int32_t NumberFormatterImpl::writeFractionDigits(const MicroProps& micros, DecimalQuantity& quantity, NumberStringBuilder& string, UErrorCode& status) { int length = 0; int fractionCount = -quantity.getLowerDisplayMagnitude(); for (int i = 0; i < fractionCount; i++) { // Get and append the next digit value int8_t nextDigit = quantity.getDigit(-i - 1); length += utils::insertDigitFromSymbols( string, string.length(), nextDigit, *micros.symbols, UNUM_FRACTION_FIELD, status); } return length; }
void LocalizedNumberFormatter::getAffixImpl(bool isPrefix, bool isNegative, UnicodeString& result, UErrorCode& status) const { NumberStringBuilder string; auto signum = static_cast<int8_t>(isNegative ? -1 : 1); // Always return affixes for plural form OTHER. static const StandardPlural::Form plural = StandardPlural::OTHER; int32_t prefixLength; if (computeCompiled(status)) { prefixLength = fCompiled->getPrefixSuffix(signum, plural, string, status); } else { prefixLength = NumberFormatterImpl::getPrefixSuffixStatic(fMacros, signum, plural, string, status); } result.remove(); if (isPrefix) { result.append(string.toTempUnicodeString().tempSubStringBetween(0, prefixLength)); } else { result.append(string.toTempUnicodeString().tempSubStringBetween(prefixLength, string.length())); } }