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