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