]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/plurfmt.cpp
ICU-66108.tar.gz
[apple/icu.git] / icuSources / i18n / plurfmt.cpp
index 9ff2bffc9d99cae2984adcde81bb7473ae5e332e..b99437630e67b5d2dc6d99ae1a1a9c8cb40c7100 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 * Copyright (C) 2009-2015, International Business Machines Corporation and
 #include "plurrule_impl.h"
 #include "uassert.h"
 #include "uhash.h"
-#include "precision.h"
-#include "visibledigits.h"
+#include "number_decimalquantity.h"
+#include "number_utils.h"
+#include "number_utypes.h"
 
 #if !UCONFIG_NO_FORMATTING
 
 U_NAMESPACE_BEGIN
 
+using number::impl::DecimalQuantity;
+
 static const UChar OTHER_STRING[] = {
     0x6F, 0x74, 0x68, 0x65, 0x72, 0  // "other"
 };
@@ -154,7 +159,7 @@ PluralFormat::copyObjects(const PluralFormat& other) {
     if (other.numberFormat == NULL) {
         numberFormat = NumberFormat::createInstance(locale, status);
     } else {
-        numberFormat = (NumberFormat*)other.numberFormat->clone();
+        numberFormat = other.numberFormat->clone();
     }
     if (other.pluralRulesWrapper.pluralRules == NULL) {
         pluralRulesWrapper.pluralRules = PluralRules::forLocale(locale, status);
@@ -216,14 +221,14 @@ PluralFormat::format(const Formattable& obj,
 
 UnicodeString
 PluralFormat::format(int32_t number, UErrorCode& status) const {
-    FieldPosition fpos(0);
+    FieldPosition fpos(FieldPosition::DONT_CARE);
     UnicodeString result;
     return format(Formattable(number), number, result, fpos, status);
 }
 
 UnicodeString
 PluralFormat::format(double number, UErrorCode& status) const {
-    FieldPosition fpos(0);
+    FieldPosition fpos(FieldPosition::DONT_CARE);
     UnicodeString result;
     return format(Formattable(number), number, result, fpos, status);
 }
@@ -256,45 +261,40 @@ PluralFormat::format(const Formattable& numberObject, double number,
     if (msgPattern.countParts() == 0) {
         return numberFormat->format(numberObject, appendTo, pos, status);
     }
+
     // Get the appropriate sub-message.
     // Select it based on the formatted number-offset.
     double numberMinusOffset = number - offset;
-    UnicodeString numberString;
-    FieldPosition ignorePos;
-    FixedPrecision fp;
-    VisibleDigitsWithExponent dec;
-    fp.initVisibleDigitsWithExponent(numberMinusOffset, dec, status);
-    if (U_FAILURE(status)) {
-        return appendTo;
-    }
+    // Call NumberFormatter to get both the DecimalQuantity and the string.
+    // This call site needs to use more internal APIs than the Java equivalent.
+    number::impl::UFormattedNumberData data;
     if (offset == 0) {
-        DecimalFormat *decFmt = dynamic_cast<DecimalFormat *>(numberFormat);
-        if(decFmt != NULL) {
-            decFmt->initVisibleDigitsWithExponent(
-                    numberObject, dec, status);
-            if (U_FAILURE(status)) {
-                return appendTo;
-            }
-            decFmt->format(dec, numberString, ignorePos, status);
-        } else {
-            numberFormat->format(
-                    numberObject, numberString, ignorePos, status);  // could be BigDecimal etc.
+        // could be BigDecimal etc.
+        numberObject.populateDecimalQuantity(data.quantity, status);
+    } else {
+        data.quantity.setToDouble(numberMinusOffset);
+    }
+    UnicodeString numberString;
+    auto *decFmt = dynamic_cast<DecimalFormat *>(numberFormat);
+    if(decFmt != nullptr) {
+        const number::LocalizedNumberFormatter* lnf = decFmt->toNumberFormatter(status);
+        if (U_FAILURE(status)) {
+            return appendTo;
         }
+        lnf->formatImpl(&data, status); // mutates &data
+        if (U_FAILURE(status)) {
+            return appendTo;
+        }
+        numberString = data.getStringRef().toUnicodeString();
     } else {
-        DecimalFormat *decFmt = dynamic_cast<DecimalFormat *>(numberFormat);
-        if(decFmt != NULL) {
-            decFmt->initVisibleDigitsWithExponent(
-                    numberMinusOffset, dec, status);
-            if (U_FAILURE(status)) {
-                return appendTo;
-            }
-            decFmt->format(dec, numberString, ignorePos, status);
+        if (offset == 0) {
+            numberFormat->format(numberObject, numberString, status);
         } else {
-            numberFormat->format(
-                    numberMinusOffset, numberString, ignorePos, status);
+            numberFormat->format(numberMinusOffset, numberString, status);
         }
     }
-    int32_t partIndex = findSubMessage(msgPattern, 0, pluralRulesWrapper, &dec, number, status);
+
+    int32_t partIndex = findSubMessage(msgPattern, 0, pluralRulesWrapper, &data.quantity, number, status);
     if (U_FAILURE(status)) { return appendTo; }
     // Replace syntactic # signs in the top level of this sub-message
     // (not in nested arguments) with the formatted number-offset.
@@ -353,7 +353,7 @@ PluralFormat::setNumberFormat(const NumberFormat* format, UErrorCode& status) {
     if (U_FAILURE(status)) {
         return;
     }
-    NumberFormat* nf = (NumberFormat*)format->clone();
+    NumberFormat* nf = format->clone();
     if (nf != NULL) {
         delete numberFormat;
         numberFormat = nf;
@@ -362,7 +362,7 @@ PluralFormat::setNumberFormat(const NumberFormat* format, UErrorCode& status) {
     }
 }
 
-Format*
+PluralFormat*
 PluralFormat::clone() const
 {
     return new PluralFormat(*this);
@@ -583,7 +583,7 @@ PluralFormat::PluralSelectorAdapter::~PluralSelectorAdapter() {
 UnicodeString PluralFormat::PluralSelectorAdapter::select(void *context, double number,
                                                           UErrorCode& /*ec*/) const {
     (void)number;  // unused except in the assertion
-    VisibleDigitsWithExponent *dec=static_cast<VisibleDigitsWithExponent *>(context);
+    IFixedDecimal *dec=static_cast<IFixedDecimal *>(context);
     return pluralRules->select(*dec);
 }