blob: 3752b1a1d280b8f22bfed294e2760a3a7b9ed75b [file] [log] [blame]
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
package com.ibm.icu.number;
import com.ibm.icu.impl.number.RoundingUtils;
/**
* A class that defines a rounding strategy based on a number of fraction places and optionally
* significant digits to be used when formatting numbers in NumberFormatter.
*
* <p>
* To create a FractionPrecision, use one of the factory methods on Precision.
*
* @stable ICU 60
* @see NumberFormatter
*/
public abstract class FractionPrecision extends Precision {
/* package-private */ FractionPrecision() {
}
/**
* Ensure that no less than this number of significant digits are retained when rounding according to
* fraction rules.
*
* <p>
* For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures
* set to 2, 3.141 becomes "3.1" instead.
*
* <p>
* This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3",
* not "3.0".
*
* @param minSignificantDigits
* The number of significant figures to guarantee.
* @return A Precision for chaining or passing to the NumberFormatter rounding() setter.
* @throws IllegalArgumentException if the input number is too big or smaller than 1.
* @stable ICU 60
* @see NumberFormatter
*/
public Precision withMinDigits(int minSignificantDigits) {
if (minSignificantDigits >= 1 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
return constructFractionSignificant(this, minSignificantDigits, -1);
} else {
throw new IllegalArgumentException("Significant digits must be between 1 and "
+ RoundingUtils.MAX_INT_FRAC_SIG
+ " (inclusive)");
}
}
/**
* Ensure that no more than this number of significant digits are retained when rounding according to
* fraction rules.
*
* <p>
* For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures
* set to 2, 123.4 becomes "120" instead.
*
* <p>
* This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2,
* 123.4 would become "120.00".
*
* @param maxSignificantDigits
* Round the number to no more than this number of significant figures.
* @return A Precision for chaining or passing to the NumberFormatter rounding() setter.
* @throws IllegalArgumentException if the input number is too big or smaller than 1.
* @stable ICU 60
* @see NumberFormatter
*/
public Precision withMaxDigits(int maxSignificantDigits) {
if (maxSignificantDigits >= 1 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
return constructFractionSignificant(this, -1, maxSignificantDigits);
} else {
throw new IllegalArgumentException("Significant digits must be between 1 and "
+ RoundingUtils.MAX_INT_FRAC_SIG
+ " (inclusive)");
}
}
}