Index: source/i18n/digitaffixesandpadding.cpp |
diff --git a/source/i18n/digitaffixesandpadding.cpp b/source/i18n/digitaffixesandpadding.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d941a573de8ff46cf80ecc01c38e808ea3cfd2f8 |
--- /dev/null |
+++ b/source/i18n/digitaffixesandpadding.cpp |
@@ -0,0 +1,173 @@ |
+/* |
+ * Copyright (C) 2015, International Business Machines |
+ * Corporation and others. All Rights Reserved. |
+ * |
+ * file name: digitaffixesandpadding.cpp |
+ */ |
+ |
+#include "unicode/utypes.h" |
+ |
+#if !UCONFIG_NO_FORMATTING |
+ |
+#include "unicode/plurrule.h" |
+#include "charstr.h" |
+#include "digitaffix.h" |
+#include "digitaffixesandpadding.h" |
+#include "digitlst.h" |
+#include "uassert.h" |
+#include "valueformatter.h" |
+#include "visibledigits.h" |
+ |
+U_NAMESPACE_BEGIN |
+ |
+UBool |
+DigitAffixesAndPadding::needsPluralRules() const { |
+ return ( |
+ fPositivePrefix.hasMultipleVariants() || |
+ fPositiveSuffix.hasMultipleVariants() || |
+ fNegativePrefix.hasMultipleVariants() || |
+ fNegativeSuffix.hasMultipleVariants()); |
+} |
+ |
+UnicodeString & |
+DigitAffixesAndPadding::formatInt32( |
+ int32_t value, |
+ const ValueFormatter &formatter, |
+ FieldPositionHandler &handler, |
+ const PluralRules *optPluralRules, |
+ UnicodeString &appendTo, |
+ UErrorCode &status) const { |
+ if (U_FAILURE(status)) { |
+ return appendTo; |
+ } |
+ if (optPluralRules != NULL || fWidth > 0 || !formatter.isFastFormattable(value)) { |
+ VisibleDigitsWithExponent digits; |
+ formatter.toVisibleDigitsWithExponent( |
+ (int64_t) value, digits, status); |
+ return format( |
+ digits, |
+ formatter, |
+ handler, |
+ optPluralRules, |
+ appendTo, |
+ status); |
+ } |
+ UBool bPositive = value >= 0; |
+ const DigitAffix *prefix = bPositive ? &fPositivePrefix.getOtherVariant() : &fNegativePrefix.getOtherVariant(); |
+ const DigitAffix *suffix = bPositive ? &fPositiveSuffix.getOtherVariant() : &fNegativeSuffix.getOtherVariant(); |
+ if (value < 0) { |
+ value = -value; |
+ } |
+ prefix->format(handler, appendTo); |
+ formatter.formatInt32(value, handler, appendTo); |
+ return suffix->format(handler, appendTo); |
+} |
+ |
+static UnicodeString & |
+formatAffix( |
+ const DigitAffix *affix, |
+ FieldPositionHandler &handler, |
+ UnicodeString &appendTo) { |
+ if (affix) { |
+ affix->format(handler, appendTo); |
+ } |
+ return appendTo; |
+} |
+ |
+static int32_t |
+countAffixChar32(const DigitAffix *affix) { |
+ if (affix) { |
+ return affix->countChar32(); |
+ } |
+ return 0; |
+} |
+ |
+UnicodeString & |
+DigitAffixesAndPadding::format( |
+ const VisibleDigitsWithExponent &digits, |
+ const ValueFormatter &formatter, |
+ FieldPositionHandler &handler, |
+ const PluralRules *optPluralRules, |
+ UnicodeString &appendTo, |
+ UErrorCode &status) const { |
+ if (U_FAILURE(status)) { |
+ return appendTo; |
+ } |
+ const DigitAffix *prefix = NULL; |
+ const DigitAffix *suffix = NULL; |
+ if (!digits.isNaN()) { |
+ UBool bPositive = !digits.isNegative(); |
+ const PluralAffix *pluralPrefix = bPositive ? &fPositivePrefix : &fNegativePrefix; |
+ const PluralAffix *pluralSuffix = bPositive ? &fPositiveSuffix : &fNegativeSuffix; |
+ if (optPluralRules == NULL || digits.isInfinite()) { |
+ prefix = &pluralPrefix->getOtherVariant(); |
+ suffix = &pluralSuffix->getOtherVariant(); |
+ } else { |
+ UnicodeString count(optPluralRules->select(digits)); |
+ prefix = &pluralPrefix->getByCategory(count); |
+ suffix = &pluralSuffix->getByCategory(count); |
+ } |
+ } |
+ if (fWidth <= 0) { |
+ formatAffix(prefix, handler, appendTo); |
+ formatter.format(digits, handler, appendTo); |
+ return formatAffix(suffix, handler, appendTo); |
+ } |
+ int32_t codePointCount = countAffixChar32(prefix) + formatter.countChar32(digits) + countAffixChar32(suffix); |
+ int32_t paddingCount = fWidth - codePointCount; |
+ switch (fPadPosition) { |
+ case kPadBeforePrefix: |
+ appendPadding(paddingCount, appendTo); |
+ formatAffix(prefix, handler, appendTo); |
+ formatter.format(digits, handler, appendTo); |
+ return formatAffix(suffix, handler, appendTo); |
+ case kPadAfterPrefix: |
+ formatAffix(prefix, handler, appendTo); |
+ appendPadding(paddingCount, appendTo); |
+ formatter.format(digits, handler, appendTo); |
+ return formatAffix(suffix, handler, appendTo); |
+ case kPadBeforeSuffix: |
+ formatAffix(prefix, handler, appendTo); |
+ formatter.format(digits, handler, appendTo); |
+ appendPadding(paddingCount, appendTo); |
+ return formatAffix(suffix, handler, appendTo); |
+ case kPadAfterSuffix: |
+ formatAffix(prefix, handler, appendTo); |
+ formatter.format(digits, handler, appendTo); |
+ formatAffix(suffix, handler, appendTo); |
+ return appendPadding(paddingCount, appendTo); |
+ default: |
+ U_ASSERT(FALSE); |
+ return appendTo; |
+ } |
+} |
+ |
+UnicodeString & |
+DigitAffixesAndPadding::format( |
+ DigitList &value, |
+ const ValueFormatter &formatter, |
+ FieldPositionHandler &handler, |
+ const PluralRules *optPluralRules, |
+ UnicodeString &appendTo, |
+ UErrorCode &status) const { |
+ VisibleDigitsWithExponent digits; |
+ formatter.toVisibleDigitsWithExponent( |
+ value, digits, status); |
+ if (U_FAILURE(status)) { |
+ return appendTo; |
+ } |
+ return format( |
+ digits, formatter, handler, optPluralRules, appendTo, status); |
+} |
+ |
+UnicodeString & |
+DigitAffixesAndPadding::appendPadding(int32_t paddingCount, UnicodeString &appendTo) const { |
+ for (int32_t i = 0; i < paddingCount; ++i) { |
+ appendTo.append(fPadChar); |
+ } |
+ return appendTo; |
+} |
+ |
+ |
+U_NAMESPACE_END |
+#endif /* #if !UCONFIG_NO_FORMATTING */ |