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