ICU 73.2  73.2
scientificnumberformatter.h
Go to the documentation of this file.
00001 // © 2016 and later: Unicode, Inc. and others.
00002 // License & terms of use: http://www.unicode.org/copyright.html
00003 /*
00004 **********************************************************************
00005 * Copyright (c) 2014-2016, International Business Machines
00006 * Corporation and others.  All Rights Reserved.
00007 **********************************************************************
00008 */
00009 #ifndef SCINUMBERFORMATTER_H
00010 #define SCINUMBERFORMATTER_H
00011 
00012 #include "unicode/utypes.h"
00013 
00014 #if U_SHOW_CPLUSPLUS_API
00015 
00016 #if !UCONFIG_NO_FORMATTING
00017 
00018 
00019 #include "unicode/unistr.h"
00020 
00026 U_NAMESPACE_BEGIN
00027 
00028 class FieldPositionIterator;
00029 class DecimalFormatSymbols;
00030 class DecimalFormat;
00031 class Formattable;
00032 
00052 class U_I18N_API ScientificNumberFormatter : public UObject {
00053 public:
00054 
00065     static ScientificNumberFormatter *createSuperscriptInstance(
00066             DecimalFormat *fmtToAdopt, UErrorCode &status);
00067 
00077     static ScientificNumberFormatter *createSuperscriptInstance(
00078             const Locale &locale, UErrorCode &status);
00079 
00080 
00093     static ScientificNumberFormatter *createMarkupInstance(
00094             DecimalFormat *fmtToAdopt,
00095             const UnicodeString &beginMarkup,
00096             const UnicodeString &endMarkup,
00097             UErrorCode &status);
00098 
00110     static ScientificNumberFormatter *createMarkupInstance(
00111             const Locale &locale,
00112             const UnicodeString &beginMarkup,
00113             const UnicodeString &endMarkup,
00114             UErrorCode &status);
00115 
00116 
00121     ScientificNumberFormatter *clone() const {
00122         return new ScientificNumberFormatter(*this);
00123     }
00124 
00129     virtual ~ScientificNumberFormatter();
00130 
00141     UnicodeString &format(
00142             const Formattable &number,
00143             UnicodeString &appendTo,
00144             UErrorCode &status) const;
00145  private:
00146     class U_I18N_API Style : public UObject {
00147     public:
00148         virtual Style *clone() const = 0;
00149     protected:
00150         virtual UnicodeString &format(
00151                 const UnicodeString &original,
00152                 FieldPositionIterator &fpi,
00153                 const UnicodeString &preExponent,
00154                 UnicodeString &appendTo,
00155                 UErrorCode &status) const = 0;
00156     private:
00157         friend class ScientificNumberFormatter;
00158     };
00159 
00160     class U_I18N_API SuperscriptStyle : public Style {
00161     public:
00162         virtual SuperscriptStyle *clone() const override;
00163     protected:
00164         virtual UnicodeString &format(
00165                 const UnicodeString &original,
00166                 FieldPositionIterator &fpi,
00167                 const UnicodeString &preExponent,
00168                 UnicodeString &appendTo,
00169                 UErrorCode &status) const override;
00170     };
00171 
00172     class U_I18N_API MarkupStyle : public Style {
00173     public:
00174         MarkupStyle(
00175                 const UnicodeString &beginMarkup,
00176                 const UnicodeString &endMarkup)
00177                 : Style(),
00178                   fBeginMarkup(beginMarkup),
00179                   fEndMarkup(endMarkup) { }
00180         virtual MarkupStyle *clone() const override;
00181     protected:
00182         virtual UnicodeString &format(
00183                 const UnicodeString &original,
00184                 FieldPositionIterator &fpi,
00185                 const UnicodeString &preExponent,
00186                 UnicodeString &appendTo,
00187                 UErrorCode &status) const override;
00188     private:
00189         UnicodeString fBeginMarkup;
00190         UnicodeString fEndMarkup;
00191     };
00192 
00193     ScientificNumberFormatter(
00194             DecimalFormat *fmtToAdopt,
00195             Style *styleToAdopt,
00196             UErrorCode &status);
00197 
00198     ScientificNumberFormatter(const ScientificNumberFormatter &other);
00199     ScientificNumberFormatter &operator=(const ScientificNumberFormatter &) = delete;
00200 
00201     static void getPreExponent(
00202             const DecimalFormatSymbols &dfs, UnicodeString &preExponent);
00203 
00204     static ScientificNumberFormatter *createInstance(
00205             DecimalFormat *fmtToAdopt,
00206             Style *styleToAdopt,
00207             UErrorCode &status);
00208 
00209     UnicodeString fPreExponent;
00210     DecimalFormat *fDecimalFormat;
00211     Style *fStyle;
00212 
00213 };
00214 
00215 U_NAMESPACE_END
00216 
00217 
00218 #endif /* !UCONFIG_NO_FORMATTING */
00219 
00220 #endif /* U_SHOW_CPLUSPLUS_API */
00221 
00222 #endif