]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/number_rounding.cpp
ICU-66108.tar.gz
[apple/icu.git] / icuSources / i18n / number_rounding.cpp
index 28ff1f13c9ce81a90a3ed3b5ceadcdc040b61a5d..a89b8e5c69920d44ca766dab3d31526c78c47e05 100644 (file)
@@ -33,7 +33,7 @@ int32_t getRoundingMagnitudeSignificant(const DecimalQuantity &value, int maxSig
     if (maxSig == -1) {
         return INT32_MIN;
     }
-    int magnitude = value.isZero() ? 0 : value.getMagnitude();
+    int magnitude = value.isZeroish() ? 0 : value.getMagnitude();
     return magnitude - maxSig + 1;
 }
 
@@ -45,7 +45,7 @@ int32_t getDisplayMagnitudeFraction(int minFrac) {
 }
 
 int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig) {
-    int magnitude = value.isZero() ? 0 : value.getMagnitude();
+    int magnitude = value.isZeroish() ? 0 : value.getMagnitude();
     return magnitude - minSig + 1;
 }
 
@@ -316,8 +316,8 @@ bool RoundingImpl::isSignificantDigits() const {
 int32_t
 RoundingImpl::chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer,
                                   UErrorCode &status) {
-    // Do not call this method with zero.
-    U_ASSERT(!input.isZero());
+    // Do not call this method with zero, NaN, or infinity.
+    U_ASSERT(!input.isZeroish());
 
     // Perform the first attempt at rounding.
     int magnitude = input.getMagnitude();
@@ -326,7 +326,7 @@ RoundingImpl::chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl:
     apply(input, status);
 
     // If the number rounded to zero, exit.
-    if (input.isZero() || U_FAILURE(status)) {
+    if (input.isZeroish() || U_FAILURE(status)) {
         return multiplier;
     }
 
@@ -384,7 +384,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
             value.setMinFraction(
                     uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig)));
             // Make sure that digits are displayed on zero.
-            if (value.isZero() && fPrecision.fUnion.fracSig.fMinSig > 0) {
+            if (value.isZeroish() && fPrecision.fUnion.fracSig.fMinSig > 0) {
                 value.setMinInteger(1);
             }
             break;
@@ -452,7 +452,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
             value.setMinFraction(
                     uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.incrSig.fMinSig)));
             // Make sure that digits are displayed on zero.
-            if (value.isZero() && fPrecision.fUnion.incrSig.fMinSig > 0) {
+            if (value.isZeroish() && fPrecision.fUnion.incrSig.fMinSig > 0) {
                 value.setMinInteger(1);
             }
             break;
@@ -465,7 +465,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
 void RoundingImpl::apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode /*status*/) {
     // This method is intended for the one specific purpose of helping print "00.000E0".
     U_ASSERT(isSignificantDigits());
-    U_ASSERT(value.isZero());
+    U_ASSERT(value.isZeroish());
     value.setMinFraction(fPrecision.fUnion.fracSig.fMinSig - minInt);
 }