precision.h revision c14898b482f76ecab9026615e2e4c6fe78358bdc
1c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/*
2c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*******************************************************************************
3c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Copyright (C) 2015, International Business Machines
4c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Corporation and others.  All Rights Reserved.
5c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*******************************************************************************
6c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* precision.h
7c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*
8c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* created on: 2015jan06
9c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* created by: Travis Keep
10c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*/
11c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
12c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifndef __PRECISION_H__
13c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#define __PRECISION_H__
14c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
15c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/uobject.h"
16c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
17c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#if !UCONFIG_NO_FORMATTING
18c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/utypes.h"
19c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
20c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "digitinterval.h"
21c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "digitlst.h"
22c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "significantdigitinterval.h"
23c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
24c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_NAMESPACE_BEGIN
25c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
26c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass VisibleDigits;
27c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass VisibleDigitsWithExponent;
28c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
29c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
30c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/**
31c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * A precision manager for values to be formatted as fixed point.
32c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Handles rounding of number to prepare it for formatting.
33c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */
34c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass U_I18N_API FixedPrecision : public UMemory {
35c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertpublic:
36c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
37c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
38c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * The smallest format interval allowed. Default is 1 integer digit and no
39c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * fraction digits.
40c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
41c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitInterval fMin;
42c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
43c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
44c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * The largest format interval allowed. Must contain fMin.
45c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *  Default is all digits.
46c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
47c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitInterval fMax;
48c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
49c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
50c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Min and max significant digits allowed. The default is no constraints.
51c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
52c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    SignificantDigitInterval fSignificant;
53c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
54c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
55c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * The rounding increment or zero if there is no rounding increment.
56c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Default is zero.
57c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
58c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitList fRoundingIncrement;
59c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
60c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
61c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * If set, causes round() to set status to U_FORMAT_INEXACT_ERROR if
62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * any rounding is done. Default is FALSE.
63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
64c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool fExactOnly;
65c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
66c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
67c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * If set, causes round() to set status to U_ILLEGAL_ARGUMENT_ERROR if
68c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * rounded number has more than maximum integer digits. Default is FALSE.
69c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
70c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool fFailIfOverMax;
71c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
72c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
73c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Controls the rounding mode that initVisibleDigits uses.
74c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Default is DecimalFormat::kRoundHalfEven
75c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
76c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DecimalFormat::ERoundingMode fRoundingMode;
77c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
78c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    FixedPrecision();
79c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
80c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
81c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Returns TRUE if this object equals rhs.
82c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
83c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool equals(const FixedPrecision &rhs) const {
84c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return (fMin.equals(rhs.fMin) &&
85c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                fMax.equals(rhs.fMax) &&
86c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                fSignificant.equals(rhs.fSignificant) &&
87c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                (fRoundingIncrement == rhs.fRoundingIncrement) &&
88c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                fExactOnly == rhs.fExactOnly &&
89c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                fFailIfOverMax == rhs.fFailIfOverMax &&
90c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                fRoundingMode == rhs.fRoundingMode);
91c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
92c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
93c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
94c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Rounds value in place to prepare it for formatting.
95c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value The value to be rounded. It is rounded in place.
96c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param exponent Always pass 0 for fixed decimal formatting. scientific
97c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *  precision passes the exponent value.  Essentially, it divides value by
98c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *  10^exponent, rounds and then multiplies by 10^exponent.
99c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status error returned here.
100c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return reference to value.
101c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
102c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitList &round(DigitList &value, int32_t exponent, UErrorCode &status) const;
103c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
104c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
105c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Returns the interval to use to format the rounded value.
106c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param roundedValue the already rounded value to format.
107c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param interval modified in place to be the interval to use to format
108c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *   the rounded value.
109c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return a reference to interval.
110c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
111c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitInterval &getInterval(
112c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            const DigitList &roundedValue, DigitInterval &interval) const;
113c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
114c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
115c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Returns TRUE if this instance allows for fast formatting of integers.
116c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
117c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool isFastFormattable() const;
118c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
119c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
120c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigits.
121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value value for VisibleDigits
122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *    Caller must not assume that the value of this parameter will remain
123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *    unchanged.
124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
125c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
126c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
127c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
128c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigits &initVisibleDigits(
129c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            DigitList &value,
130c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigits &digits,
131c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
132c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigits.
135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value value for VisibleDigits
136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
137c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
138c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
139c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
140c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigits &initVisibleDigits(
141c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            double value,
142c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigits &digits,
143c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
144c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
145c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
146c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigits.
147c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value value for VisibleDigits
148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
151c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
152c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigits &initVisibleDigits(
153c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t value,
154c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigits &digits,
155c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
156c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
157c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
158c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigitsWithExponent.
159c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value value for VisibleDigits
160c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *    Caller must not assume that the value of this parameter will remain
161c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *    unchanged.
162c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
163c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
164c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
165c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
166c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
167c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            DigitList &value,
168c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
169c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
170c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
171c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
172c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigitsWithExponent.
173c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value value for VisibleDigits
174c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
175c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
176c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
177c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
178c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
179c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            double value,
180c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
181c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
182c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
183c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
184c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigitsWithExponent.
185c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value value for VisibleDigits
186c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
187c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
188c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
189c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
190c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
191c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t value,
192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
193c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
194c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
195c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertprivate:
196c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
197c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Attempts to initialize 'digits' using simple mod 10 arithmetic.
198c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Returns FALSE if this is not possible such as when rounding
199c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * would change the value. Otherwise returns TRUE.
200c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *
201c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * If the method returns FALSE, caller should create a DigitList
202c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * and use it to initialize 'digits'. If this method returns TRUE,
203c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * caller should accept the value stored in 'digits'. If this
204c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * method returns TRUE along with a non zero error, caller must accept
205c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * the error and not try again with a DigitList.
206c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *
207c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Before calling this method, caller must verify that this object
208c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * has no rounding increment set.
209c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *
210c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * The value that 'digits' is initialized to is mantissa * 10^exponent.
211c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * For example mantissa = 54700 and exponent = -3 means 54.7. The
212c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * properties of this object (such as min and max fraction digits),
213c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * not the number of trailing zeros in the mantissa, determine whether or
214c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * not the result contains any trailing 0's after the decimal point.
215c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *
216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param mantissa the digits. May be positive or negative. May contain
217c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *  trailing zeros.
218c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param exponent must always be zero or negative. An exponent > 0
219c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *  yields undefined results!
220c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits result stored here.
221c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
222c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
223c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool
224c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    initVisibleDigits(
225c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t mantissa,
226c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int32_t exponent,
227c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigits &digits,
228c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
229c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool isRoundingRequired(
230c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int32_t upperExponent, int32_t lowerExponent) const;
231c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitInterval &getIntervalForZero(DigitInterval &interval) const;
232c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitInterval &getInterval(
233c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int32_t upperExponent, DigitInterval &interval) const;
234c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    static UBool handleNonNumeric(DigitList &value, VisibleDigits &digits);
235c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
236c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    friend class ScientificPrecision;
237c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert};
238c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
239c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/**
240c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * A precision manager for values to be expressed as scientific notation.
241c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */
242c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass U_I18N_API ScientificPrecision : public UMemory {
243c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertpublic:
244c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    FixedPrecision fMantissa;
245c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    int32_t fMinExponentDigits;
246c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
247c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    ScientificPrecision();
248c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
249c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
250c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * rounds value in place to prepare it for formatting.
251c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value The value to be rounded. It is rounded in place.
252c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status error returned here.
253c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return reference to value.
254c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
255c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitList &round(DigitList &value, UErrorCode &status) const;
256c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
257c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
258c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Converts value to a mantissa and exponent.
259c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *
260c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value modified in place to be the mantissa. Depending on
261c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *   the precision settings, the resulting mantissa may not fall
262c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *   between 1.0 and 10.0.
263c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return the exponent of value.
264c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
265c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    int32_t toScientific(DigitList &value) const;
266c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
267c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
268c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Returns TRUE if this object equals rhs.
269c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
270c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool equals(const ScientificPrecision &rhs) const {
271c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return fMantissa.equals(rhs.fMantissa) && fMinExponentDigits == rhs.fMinExponentDigits;
272c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
273c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
274c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
275c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigitsWithExponent.
276c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value the value
277c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *    Caller must not assume that the value of this parameter will remain
278c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *    unchanged.
279c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
280c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
281c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
282c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
283c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
284c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            DigitList &value,
285c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
286c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
287c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
288c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
289c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigitsWithExponent.
290c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value the value
291c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
292c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
293c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
294c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
295c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
296c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            double value,
297c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
298c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
299c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
300c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
301c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Initializes a VisibleDigitsWithExponent.
302c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value the value
303c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param digits This is the value that is initialized.
304c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
305c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @return digits
306c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
307c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &initVisibleDigitsWithExponent(
308c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t value,
309c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
310c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
311c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
312c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertprivate:
313c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    int32_t getMultiplier() const;
314c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
315c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert};
316c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
317c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
318c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
319c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_NAMESPACE_END
320c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif // #if !UCONFIG_NO_FORMATTING
321c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif  // __PRECISION_H__
322