1 // Copyright (C) 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ********************************************************************** 5 * Copyright (c) 2014-2016, International Business Machines 6 * Corporation and others. All Rights Reserved. 7 ********************************************************************** 8 */ 9 #ifndef SCINUMBERFORMATTER_H 10 #define SCINUMBERFORMATTER_H 11 12 #include "unicode/utypes.h" 13 14 #if !UCONFIG_NO_FORMATTING 15 16 17 #include "unicode/unistr.h" 18 19 /** 20 * \file 21 * \brief C++ API: Formats in scientific notation. 22 */ 23 24 U_NAMESPACE_BEGIN 25 26 class FieldPositionIterator; 27 class DecimalFormatStaticSets; 28 class DecimalFormatSymbols; 29 class DecimalFormat; 30 class Formattable; 31 32 /** 33 * A formatter that formats numbers in user-friendly scientific notation. 34 * 35 * Sample code: 36 * <pre> 37 * UErrorCode status = U_ZERO_ERROR; 38 * LocalPointer<ScientificNumberFormatter> fmt( 39 * ScientificNumberFormatter::createMarkupInstance( 40 * "en", "<sup>", "</sup>", status)); 41 * if (U_FAILURE(status)) { 42 * return; 43 * } 44 * UnicodeString appendTo; 45 * // appendTo = "1.23456x10<sup>-78</sup>" 46 * fmt->format(1.23456e-78, appendTo, status); 47 * </pre> 48 * 49 * @stable ICU 55 50 */ 51 class U_I18N_API ScientificNumberFormatter : public UObject { 52 public: 53 54 /** 55 * Creates a ScientificNumberFormatter instance that uses 56 * superscript characters for exponents. 57 * @param fmtToAdopt The DecimalFormat which must be configured for 58 * scientific notation. 59 * @param status error returned here. 60 * @return The new ScientificNumberFormatter instance. 61 * 62 * @stable ICU 55 63 */ 64 static ScientificNumberFormatter *createSuperscriptInstance( 65 DecimalFormat *fmtToAdopt, UErrorCode &status); 66 67 /** 68 * Creates a ScientificNumberFormatter instance that uses 69 * superscript characters for exponents for this locale. 70 * @param locale The locale 71 * @param status error returned here. 72 * @return The ScientificNumberFormatter instance. 73 * 74 * @stable ICU 55 75 */ 76 static ScientificNumberFormatter *createSuperscriptInstance( 77 const Locale &locale, UErrorCode &status); 78 79 80 /** 81 * Creates a ScientificNumberFormatter instance that uses 82 * markup for exponents. 83 * @param fmtToAdopt The DecimalFormat which must be configured for 84 * scientific notation. 85 * @param beginMarkup the markup to start superscript. 86 * @param endMarkup the markup to end superscript. 87 * @param status error returned here. 88 * @return The new ScientificNumberFormatter instance. 89 * 90 * @stable ICU 55 91 */ 92 static ScientificNumberFormatter *createMarkupInstance( 93 DecimalFormat *fmtToAdopt, 94 const UnicodeString &beginMarkup, 95 const UnicodeString &endMarkup, 96 UErrorCode &status); 97 98 /** 99 * Creates a ScientificNumberFormatter instance that uses 100 * markup for exponents for this locale. 101 * @param locale The locale 102 * @param beginMarkup the markup to start superscript. 103 * @param endMarkup the markup to end superscript. 104 * @param status error returned here. 105 * @return The ScientificNumberFormatter instance. 106 * 107 * @stable ICU 55 108 */ 109 static ScientificNumberFormatter *createMarkupInstance( 110 const Locale &locale, 111 const UnicodeString &beginMarkup, 112 const UnicodeString &endMarkup, 113 UErrorCode &status); 114 115 116 /** 117 * Returns a copy of this object. Caller must free returned copy. 118 * @stable ICU 55 119 */ clone()120 ScientificNumberFormatter *clone() const { 121 return new ScientificNumberFormatter(*this); 122 } 123 124 /** 125 * Destructor. 126 * @stable ICU 55 127 */ 128 virtual ~ScientificNumberFormatter(); 129 130 /** 131 * Formats a number into user friendly scientific notation. 132 * 133 * @param number the number to format. 134 * @param appendTo formatted string appended here. 135 * @param status any error returned here. 136 * @return appendTo 137 * 138 * @stable ICU 55 139 */ 140 UnicodeString &format( 141 const Formattable &number, 142 UnicodeString &appendTo, 143 UErrorCode &status) const; 144 private: 145 class U_I18N_API Style : public UObject { 146 public: 147 virtual Style *clone() const = 0; 148 protected: 149 virtual UnicodeString &format( 150 const UnicodeString &original, 151 FieldPositionIterator &fpi, 152 const UnicodeString &preExponent, 153 const DecimalFormatStaticSets &decimalFormatSets, 154 UnicodeString &appendTo, 155 UErrorCode &status) const = 0; 156 private: 157 friend class ScientificNumberFormatter; 158 }; 159 160 class U_I18N_API SuperscriptStyle : public Style { 161 public: 162 virtual Style *clone() const; 163 protected: 164 virtual UnicodeString &format( 165 const UnicodeString &original, 166 FieldPositionIterator &fpi, 167 const UnicodeString &preExponent, 168 const DecimalFormatStaticSets &decimalFormatSets, 169 UnicodeString &appendTo, 170 UErrorCode &status) const; 171 }; 172 173 class U_I18N_API MarkupStyle : public Style { 174 public: MarkupStyle(const UnicodeString & beginMarkup,const UnicodeString & endMarkup)175 MarkupStyle( 176 const UnicodeString &beginMarkup, 177 const UnicodeString &endMarkup) 178 : Style(), 179 fBeginMarkup(beginMarkup), 180 fEndMarkup(endMarkup) { } 181 virtual Style *clone() const; 182 protected: 183 virtual UnicodeString &format( 184 const UnicodeString &original, 185 FieldPositionIterator &fpi, 186 const UnicodeString &preExponent, 187 const DecimalFormatStaticSets &decimalFormatSets, 188 UnicodeString &appendTo, 189 UErrorCode &status) const; 190 private: 191 UnicodeString fBeginMarkup; 192 UnicodeString fEndMarkup; 193 }; 194 195 ScientificNumberFormatter( 196 DecimalFormat *fmtToAdopt, 197 Style *styleToAdopt, 198 UErrorCode &status); 199 200 ScientificNumberFormatter(const ScientificNumberFormatter &other); 201 ScientificNumberFormatter &operator=(const ScientificNumberFormatter &); 202 203 static void getPreExponent( 204 const DecimalFormatSymbols &dfs, UnicodeString &preExponent); 205 206 static ScientificNumberFormatter *createInstance( 207 DecimalFormat *fmtToAdopt, 208 Style *styleToAdopt, 209 UErrorCode &status); 210 211 UnicodeString fPreExponent; 212 DecimalFormat *fDecimalFormat; 213 Style *fStyle; 214 const DecimalFormatStaticSets *fStaticSets; 215 216 }; 217 218 U_NAMESPACE_END 219 220 221 #endif /* !UCONFIG_NO_FORMATTING */ 222 #endif 223