1 /* 2 ******************************************************************************* * Copyright (C) 2015, International Business Machines 3 * Corporation and others. All Rights Reserved. 4 ******************************************************************************* 5 * visibledigits.h 6 * 7 * created on: 2015jun20 8 * created by: Travis Keep 9 */ 10 11 #ifndef __VISIBLEDIGITS_H__ 12 #define __VISIBLEDIGITS_H__ 13 14 #include "unicode/utypes.h" 15 16 #if !UCONFIG_NO_FORMATTING 17 18 #include "unicode/uobject.h" 19 20 #include "charstr.h" 21 #include "digitinterval.h" 22 23 U_NAMESPACE_BEGIN 24 25 class DigitList; 26 27 /** 28 * VisibleDigits represents the digits visible for formatting. 29 * Once initialized using a FixedPrecision instance, VisibleDigits instances 30 * remain unchanged until they are initialized again. A VisibleDigits with 31 * a numeric value equal to 3.0 could be "3", "3.0", "3.00" or even "003.0" 32 * depending on settings of the FixedPrecision instance used to initialize it. 33 */ 34 class U_I18N_API VisibleDigits : public UMemory { 35 public: VisibleDigits()36 VisibleDigits() : fExponent(0), fFlags(0), fAbsIntValue(0), fAbsIntValueSet(FALSE), fAbsDoubleValue(0.0), fAbsDoubleValueSet(FALSE) { } 37 38 UBool isNegative() const; 39 UBool isNaN() const; 40 UBool isInfinite() const; 41 UBool isNaNOrInfinity() const; 42 43 /** 44 * Gets the digit at particular exponent, if number is 987.6, then 45 * getDigit(2) == 9 and gitDigit(0) == 7 and gitDigit(-1) == 6. 46 * If isNaN() or isInfinity() return TRUE, then the result of this 47 * function is undefined. 48 */ 49 int32_t getDigitByExponent(int32_t digitPos) const; 50 51 /** 52 * Returns the digit interval which indicates the leftmost and rightmost 53 * position of this instance. 54 * If isNaN() or isInfinity() return TRUE, then the result of this 55 * function is undefined. 56 */ getInterval()57 const DigitInterval &getInterval() const { return fInterval; } 58 59 /** 60 * Gets the parameters needed to create a FixedDecimal. 61 */ 62 void getFixedDecimal(double &source, int64_t &intValue, int64_t &f, int64_t &t, int32_t &v, UBool &hasIntValue) const; 63 64 65 private: 66 /** 67 * The digits, least significant first. Both the least and most 68 * significant digit in this list are non-zero; however, digits in the 69 * middle may be zero. This field contains values between (char) 0, and 70 * (char) 9 inclusive. 71 */ 72 CharString fDigits; 73 74 /** 75 * The range of displayable digits. This field is needed to account for 76 * any leading and trailing zeros which are not stored in fDigits. 77 */ 78 DigitInterval fInterval; 79 80 /** 81 * The exponent value of the least significant digit in fDigits. For 82 * example, fExponent = 2 and fDigits = {7, 8, 5} represents 58700. 83 */ 84 int32_t fExponent; 85 86 /** 87 * Contains flags such as NaN, Inf, and negative. 88 */ 89 int32_t fFlags; 90 91 /** 92 * Contains the absolute value of the digits left of the decimal place 93 * if fAbsIntValueSet is TRUE 94 */ 95 int64_t fAbsIntValue; 96 97 /** 98 * Indicates whether or not fAbsIntValue is set. 99 */ 100 UBool fAbsIntValueSet; 101 102 /** 103 * Contains the absolute value of the value this instance represents 104 * if fAbsDoubleValueSet is TRUE 105 */ 106 double fAbsDoubleValue; 107 108 /** 109 * Indicates whether or not fAbsDoubleValue is set. 110 */ 111 UBool fAbsDoubleValueSet; 112 113 void setNegative(); 114 void setNaN(); 115 void setInfinite(); 116 void clear(); 117 double computeAbsDoubleValue() const; 118 UBool isOverMaxDigits() const; 119 120 VisibleDigits(const VisibleDigits &); 121 VisibleDigits &operator=(const VisibleDigits &); 122 123 friend class FixedPrecision; 124 friend class VisibleDigitsWithExponent; 125 }; 126 127 /** 128 * A VisibleDigits with a possible exponent. 129 */ 130 class U_I18N_API VisibleDigitsWithExponent : public UMemory { 131 public: VisibleDigitsWithExponent()132 VisibleDigitsWithExponent() : fHasExponent(FALSE) { } getMantissa()133 const VisibleDigits &getMantissa() const { return fMantissa; } getExponent()134 const VisibleDigits *getExponent() const { 135 return fHasExponent ? &fExponent : NULL; 136 } clear()137 void clear() { 138 fMantissa.clear(); 139 fExponent.clear(); 140 fHasExponent = FALSE; 141 } isNegative()142 UBool isNegative() const { return fMantissa.isNegative(); } isNaN()143 UBool isNaN() const { return fMantissa.isNaN(); } isInfinite()144 UBool isInfinite() const { return fMantissa.isInfinite(); } 145 private: 146 VisibleDigitsWithExponent(const VisibleDigitsWithExponent &); 147 VisibleDigitsWithExponent &operator=( 148 const VisibleDigitsWithExponent &); 149 VisibleDigits fMantissa; 150 VisibleDigits fExponent; 151 UBool fHasExponent; 152 153 friend class ScientificPrecision; 154 friend class FixedPrecision; 155 }; 156 157 158 U_NAMESPACE_END 159 #endif /* #if !UCONFIG_NO_FORMATTING */ 160 #endif // __VISIBLEDIGITS_H__ 161