13c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep/* 23c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep********************************************************************** 33c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep* Copyright (c) 2014, International Business Machines 43c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep* Corporation and others. All Rights Reserved. 53c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep********************************************************************** 63c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep*/ 73c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#ifndef SCINUMBERFORMATTER_H 83c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#define SCINUMBERFORMATTER_H 93c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 103c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#include "unicode/utypes.h" 113c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 123c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#if !UCONFIG_NO_FORMATTING 133c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 143c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#ifndef U_HIDE_DRAFT_API 153c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 163c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#include "unicode/unistr.h" 173c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 183c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep/** 193c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * \file 203c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * \brief C++ API: Formats in scientific notation. 213c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 223c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 233c580527bbfaf374a2a2d15ccc16363d36e6e803Travis KeepU_NAMESPACE_BEGIN 243c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 253c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keepclass FieldPositionIterator; 263c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keepclass DecimalFormatStaticSets; 273c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keepclass DecimalFormatSymbols; 283c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keepclass DecimalFormat; 293c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keepclass Formattable; 303c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 313c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep/** 323c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * A formatter that formats numbers in user-friendly scientific notation. 333c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 343c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Sample code: 353c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * <pre> 363c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * UErrorCode status = U_ZERO_ERROR; 373c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * LocalPointer<ScientificNumberFormatter> fmt( 383c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * ScientificNumberFormatter::createMarkupInstance( 393c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * "en", "<sup>", "</sup>", status)); 403c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * if (U_FAILURE(status)) { 413c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * return; 423c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * } 433c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * UnicodeString appendTo; 443c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * // appendTo = "1.23456x10<sup>-78</sup>" 453c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * fmt->format(1.23456e-78, appendTo, status); 463c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * </pre> 473c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 483c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 493c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 503c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keepclass U_I18N_API ScientificNumberFormatter : public UObject { 513c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keeppublic: 523c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 533c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep /** 543c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Creates a ScientificNumberFormatter instance that uses 553c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * superscript characters for exponents. 563c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param fmtToAdopt The DecimalFormat which must be configured for 573c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * scientific notation. 583c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param status error returned here. 593c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @return The new ScientificNumberFormatter instance. 603c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 613c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 623c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 633c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep static ScientificNumberFormatter *createSuperscriptInstance( 643c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep DecimalFormat *fmtToAdopt, UErrorCode &status); 653c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 663c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep /** 673c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Creates a ScientificNumberFormatter instance that uses 683c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * superscript characters for exponents for this locale. 693c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param locale The locale 703c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param status error returned here. 713c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @return The ScientificNumberFormatter instance. 723c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 733c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 743c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 753c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep static ScientificNumberFormatter *createSuperscriptInstance( 763c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const Locale &locale, UErrorCode &status); 773c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 783c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 793c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep /** 803c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Creates a ScientificNumberFormatter instance that uses 813c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * markup for exponents. 823c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param fmtToAdopt The DecimalFormat which must be configured for 833c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * scientific notation. 843c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param beginMarkup the markup to start superscript. 853c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param endMarkup the markup to end superscript. 863c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param status error returned here. 873c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @return The new ScientificNumberFormatter instance. 883c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 893c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 903c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 913c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep static ScientificNumberFormatter *createMarkupInstance( 923c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep DecimalFormat *fmtToAdopt, 933c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &beginMarkup, 943c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &endMarkup, 953c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status); 963c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 973c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep /** 983c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Creates a ScientificNumberFormatter instance that uses 993c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * markup for exponents for this locale. 1003c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param locale The locale 1013c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param beginMarkup the markup to start superscript. 1023c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param endMarkup the markup to end superscript. 1033c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param status error returned here. 1043c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @return The ScientificNumberFormatter instance. 1053c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 1063c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 1073c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 1083c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep static ScientificNumberFormatter *createMarkupInstance( 1093c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const Locale &locale, 1103c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &beginMarkup, 1113c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &endMarkup, 1123c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status); 1133c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1143c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1153c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep /** 1163c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Returns a copy of this object. Caller must free returned copy. 1173c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 1183c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 1193c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep ScientificNumberFormatter *clone() const { 1203c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep return new ScientificNumberFormatter(*this); 1213c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep } 1223c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1233c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep /** 1243c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Destructor. 1253c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 1263c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 1273c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep virtual ~ScientificNumberFormatter(); 1283c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1293c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep /** 1303c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * Formats a number into user friendly scientific notation. 1313c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 1323c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param number the number to format. 1333c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param appendTo formatted string appended here. 1343c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @param status any error returned here. 1353c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @return appendTo 1363c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * 1373c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep * @draft ICU 55 1383c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep */ 1393c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString &format( 1403c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const Formattable &number, 1413c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString &appendTo, 1423c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status) const; 1433c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep private: 1443c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep class U_I18N_API Style : public UObject { 1453c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep public: 1463c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep virtual Style *clone() const = 0; 1473c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep protected: 1483c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep virtual UnicodeString &format( 1493c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &original, 1503c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep FieldPositionIterator &fpi, 1513c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &preExponent, 1523c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const DecimalFormatStaticSets &decimalFormatSets, 1533c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString &appendTo, 1543c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status) const = 0; 1553c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep private: 1563c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep friend class ScientificNumberFormatter; 1573c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep }; 1583c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1593c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep class U_I18N_API SuperscriptStyle : public Style { 1603c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep public: 1613c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep virtual Style *clone() const; 1623c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep protected: 1633c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep virtual UnicodeString &format( 1643c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &original, 1653c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep FieldPositionIterator &fpi, 1663c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &preExponent, 1673c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const DecimalFormatStaticSets &decimalFormatSets, 1683c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString &appendTo, 1693c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status) const; 1703c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep }; 1713c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1723c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep class U_I18N_API MarkupStyle : public Style { 1733c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep public: 1743c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep MarkupStyle( 1753c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &beginMarkup, 1763c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &endMarkup) 1773c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep : Style(), 1783c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep fBeginMarkup(beginMarkup), 1793c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep fEndMarkup(endMarkup) { } 1803c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep virtual Style *clone() const; 1813c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep protected: 1823c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep virtual UnicodeString &format( 1833c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &original, 1843c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep FieldPositionIterator &fpi, 1853c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const UnicodeString &preExponent, 1863c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const DecimalFormatStaticSets &decimalFormatSets, 1873c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString &appendTo, 1883c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status) const; 1893c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep private: 1903c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString fBeginMarkup; 1913c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString fEndMarkup; 1923c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep }; 1933c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1943c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep ScientificNumberFormatter( 1953c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep DecimalFormat *fmtToAdopt, 1963c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep Style *styleToAdopt, 1973c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status); 1983c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 1993c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep ScientificNumberFormatter(const ScientificNumberFormatter &other); 2003c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep ScientificNumberFormatter &operator=(const ScientificNumberFormatter &); 2013c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 2023c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep static void getPreExponent( 2033c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const DecimalFormatSymbols &dfs, UnicodeString &preExponent); 2043c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 2053c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep static ScientificNumberFormatter *createInstance( 2063c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep DecimalFormat *fmtToAdopt, 2073c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep Style *styleToAdopt, 2083c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UErrorCode &status); 2093c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 2103c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep UnicodeString fPreExponent; 2113c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep DecimalFormat *fDecimalFormat; 2123c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep Style *fStyle; 2133c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep const DecimalFormatStaticSets *fStaticSets; 2143c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 2153c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep}; 2163c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 2173c580527bbfaf374a2a2d15ccc16363d36e6e803Travis KeepU_NAMESPACE_END 2183c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 2193c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#endif /* U_HIDE_DRAFT_API */ 2203c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep 2213c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#endif /* !UCONFIG_NO_FORMATTING */ 2223c580527bbfaf374a2a2d15ccc16363d36e6e803Travis Keep#endif 223