| Index: source/i18n/precision.h
|
| diff --git a/source/i18n/precision.h b/source/i18n/precision.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..772721677cc01dcc5602e1171699ec8208d70bf4
|
| --- /dev/null
|
| +++ b/source/i18n/precision.h
|
| @@ -0,0 +1,321 @@
|
| +/*
|
| +*******************************************************************************
|
| +* Copyright (C) 2015, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +*******************************************************************************
|
| +* precision.h
|
| +*
|
| +* created on: 2015jan06
|
| +* created by: Travis Keep
|
| +*/
|
| +
|
| +#ifndef __PRECISION_H__
|
| +#define __PRECISION_H__
|
| +
|
| +#include "unicode/uobject.h"
|
| +
|
| +#if !UCONFIG_NO_FORMATTING
|
| +#include "unicode/utypes.h"
|
| +
|
| +#include "digitinterval.h"
|
| +#include "digitlst.h"
|
| +#include "significantdigitinterval.h"
|
| +
|
| +U_NAMESPACE_BEGIN
|
| +
|
| +class VisibleDigits;
|
| +class VisibleDigitsWithExponent;
|
| +
|
| +
|
| +/**
|
| + * A precision manager for values to be formatted as fixed point.
|
| + * Handles rounding of number to prepare it for formatting.
|
| + */
|
| +class U_I18N_API FixedPrecision : public UMemory {
|
| +public:
|
| +
|
| + /**
|
| + * The smallest format interval allowed. Default is 1 integer digit and no
|
| + * fraction digits.
|
| + */
|
| + DigitInterval fMin;
|
| +
|
| + /**
|
| + * The largest format interval allowed. Must contain fMin.
|
| + * Default is all digits.
|
| + */
|
| + DigitInterval fMax;
|
| +
|
| + /**
|
| + * Min and max significant digits allowed. The default is no constraints.
|
| + */
|
| + SignificantDigitInterval fSignificant;
|
| +
|
| + /**
|
| + * The rounding increment or zero if there is no rounding increment.
|
| + * Default is zero.
|
| + */
|
| + DigitList fRoundingIncrement;
|
| +
|
| + /**
|
| + * If set, causes round() to set status to U_FORMAT_INEXACT_ERROR if
|
| + * any rounding is done. Default is FALSE.
|
| + */
|
| + UBool fExactOnly;
|
| +
|
| + /**
|
| + * If set, causes round() to set status to U_ILLEGAL_ARGUMENT_ERROR if
|
| + * rounded number has more than maximum integer digits. Default is FALSE.
|
| + */
|
| + UBool fFailIfOverMax;
|
| +
|
| + /**
|
| + * Controls the rounding mode that initVisibleDigits uses.
|
| + * Default is DecimalFormat::kRoundHalfEven
|
| + */
|
| + DecimalFormat::ERoundingMode fRoundingMode;
|
| +
|
| + FixedPrecision();
|
| +
|
| + /**
|
| + * Returns TRUE if this object equals rhs.
|
| + */
|
| + UBool equals(const FixedPrecision &rhs) const {
|
| + return (fMin.equals(rhs.fMin) &&
|
| + fMax.equals(rhs.fMax) &&
|
| + fSignificant.equals(rhs.fSignificant) &&
|
| + (fRoundingIncrement == rhs.fRoundingIncrement) &&
|
| + fExactOnly == rhs.fExactOnly &&
|
| + fFailIfOverMax == rhs.fFailIfOverMax &&
|
| + fRoundingMode == rhs.fRoundingMode);
|
| + }
|
| +
|
| + /**
|
| + * Rounds value in place to prepare it for formatting.
|
| + * @param value The value to be rounded. It is rounded in place.
|
| + * @param exponent Always pass 0 for fixed decimal formatting. scientific
|
| + * precision passes the exponent value. Essentially, it divides value by
|
| + * 10^exponent, rounds and then multiplies by 10^exponent.
|
| + * @param status error returned here.
|
| + * @return reference to value.
|
| + */
|
| + DigitList &round(DigitList &value, int32_t exponent, UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Returns the interval to use to format the rounded value.
|
| + * @param roundedValue the already rounded value to format.
|
| + * @param interval modified in place to be the interval to use to format
|
| + * the rounded value.
|
| + * @return a reference to interval.
|
| + */
|
| + DigitInterval &getInterval(
|
| + const DigitList &roundedValue, DigitInterval &interval) const;
|
| +
|
| + /**
|
| + * Returns TRUE if this instance allows for fast formatting of integers.
|
| + */
|
| + UBool isFastFormattable() const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigits.
|
| + * @param value value for VisibleDigits
|
| + * Caller must not assume that the value of this parameter will remain
|
| + * unchanged.
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigits &initVisibleDigits(
|
| + DigitList &value,
|
| + VisibleDigits &digits,
|
| + UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigits.
|
| + * @param value value for VisibleDigits
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigits &initVisibleDigits(
|
| + double value,
|
| + VisibleDigits &digits,
|
| + UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigits.
|
| + * @param value value for VisibleDigits
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigits &initVisibleDigits(
|
| + int64_t value,
|
| + VisibleDigits &digits,
|
| + UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigitsWithExponent.
|
| + * @param value value for VisibleDigits
|
| + * Caller must not assume that the value of this parameter will remain
|
| + * unchanged.
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
|
| + DigitList &value,
|
| + VisibleDigitsWithExponent &digits,
|
| + UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigitsWithExponent.
|
| + * @param value value for VisibleDigits
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
|
| + double value,
|
| + VisibleDigitsWithExponent &digits,
|
| + UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigitsWithExponent.
|
| + * @param value value for VisibleDigits
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
|
| + int64_t value,
|
| + VisibleDigitsWithExponent &digits,
|
| + UErrorCode &status) const;
|
| +
|
| +private:
|
| + /**
|
| + * Attempts to initialize 'digits' using simple mod 10 arithmetic.
|
| + * Returns FALSE if this is not possible such as when rounding
|
| + * would change the value. Otherwise returns TRUE.
|
| + *
|
| + * If the method returns FALSE, caller should create a DigitList
|
| + * and use it to initialize 'digits'. If this method returns TRUE,
|
| + * caller should accept the value stored in 'digits'. If this
|
| + * method returns TRUE along with a non zero error, caller must accept
|
| + * the error and not try again with a DigitList.
|
| + *
|
| + * Before calling this method, caller must verify that this object
|
| + * has no rounding increment set.
|
| + *
|
| + * The value that 'digits' is initialized to is mantissa * 10^exponent.
|
| + * For example mantissa = 54700 and exponent = -3 means 54.7. The
|
| + * properties of this object (such as min and max fraction digits),
|
| + * not the number of trailing zeros in the mantissa, determine whether or
|
| + * not the result contains any trailing 0's after the decimal point.
|
| + *
|
| + * @param mantissa the digits. May be positive or negative. May contain
|
| + * trailing zeros.
|
| + * @param exponent must always be zero or negative. An exponent > 0
|
| + * yields undefined results!
|
| + * @param digits result stored here.
|
| + * @param status any error returned here.
|
| + */
|
| + UBool
|
| + initVisibleDigits(
|
| + int64_t mantissa,
|
| + int32_t exponent,
|
| + VisibleDigits &digits,
|
| + UErrorCode &status) const;
|
| + UBool isRoundingRequired(
|
| + int32_t upperExponent, int32_t lowerExponent) const;
|
| + DigitInterval &getIntervalForZero(DigitInterval &interval) const;
|
| + DigitInterval &getInterval(
|
| + int32_t upperExponent, DigitInterval &interval) const;
|
| + static UBool handleNonNumeric(DigitList &value, VisibleDigits &digits);
|
| +
|
| + friend class ScientificPrecision;
|
| +};
|
| +
|
| +/**
|
| + * A precision manager for values to be expressed as scientific notation.
|
| + */
|
| +class U_I18N_API ScientificPrecision : public UMemory {
|
| +public:
|
| + FixedPrecision fMantissa;
|
| + int32_t fMinExponentDigits;
|
| +
|
| + ScientificPrecision();
|
| +
|
| + /**
|
| + * rounds value in place to prepare it for formatting.
|
| + * @param value The value to be rounded. It is rounded in place.
|
| + * @param status error returned here.
|
| + * @return reference to value.
|
| + */
|
| + DigitList &round(DigitList &value, UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Converts value to a mantissa and exponent.
|
| + *
|
| + * @param value modified in place to be the mantissa. Depending on
|
| + * the precision settings, the resulting mantissa may not fall
|
| + * between 1.0 and 10.0.
|
| + * @return the exponent of value.
|
| + */
|
| + int32_t toScientific(DigitList &value) const;
|
| +
|
| + /**
|
| + * Returns TRUE if this object equals rhs.
|
| + */
|
| + UBool equals(const ScientificPrecision &rhs) const {
|
| + return fMantissa.equals(rhs.fMantissa) && fMinExponentDigits == rhs.fMinExponentDigits;
|
| + }
|
| +
|
| + /**
|
| + * Initializes a VisibleDigitsWithExponent.
|
| + * @param value the value
|
| + * Caller must not assume that the value of this parameter will remain
|
| + * unchanged.
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
|
| + DigitList &value,
|
| + VisibleDigitsWithExponent &digits,
|
| + UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigitsWithExponent.
|
| + * @param value the value
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
|
| + double value,
|
| + VisibleDigitsWithExponent &digits,
|
| + UErrorCode &status) const;
|
| +
|
| + /**
|
| + * Initializes a VisibleDigitsWithExponent.
|
| + * @param value the value
|
| + * @param digits This is the value that is initialized.
|
| + * @param status any error returned here.
|
| + * @return digits
|
| + */
|
| + VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
|
| + int64_t value,
|
| + VisibleDigitsWithExponent &digits,
|
| + UErrorCode &status) const;
|
| +
|
| +private:
|
| + int32_t getMultiplier() const;
|
| +
|
| +};
|
| +
|
| +
|
| +
|
| +U_NAMESPACE_END
|
| +#endif // #if !UCONFIG_NO_FORMATTING
|
| +#endif // __PRECISION_H__
|
|
|