+// © 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"
};
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);
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);
}
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.
if (U_FAILURE(status)) {
return;
}
- NumberFormat* nf = (NumberFormat*)format->clone();
+ NumberFormat* nf = format->clone();
if (nf != NULL) {
delete numberFormat;
numberFormat = nf;
}
}
-Format*
+PluralFormat*
PluralFormat::clone() const
{
return new PluralFormat(*this);
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);
}