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