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