16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 2005-2013, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File WINNMFMT.H
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __WINNMFMT
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __WINNMFMT
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/format.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/datefmt.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Format numbers using Windows API.
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgunion FormatInfo;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Win32NumberFormat : public NumberFormat
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Win32NumberFormat(const Locale &locale, UBool currency, UErrorCode &status);
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Win32NumberFormat(const Win32NumberFormat &other);
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~Win32NumberFormat();
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual Format *clone(void) const;
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Win32NumberFormat &operator=(const Win32NumberFormat &other);
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Format a double number. Concrete subclasses must implement
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * these pure virtual methods.
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param number    The value to be formatted.
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param appendTo  Output parameter to receive result.
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  Result is appended to existing contents.
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pos       On input: an alignment field, if desired.
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  On output: the offsets of the alignment field.
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          Reference to 'appendTo' parameter.
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeString& format(double number,
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  UnicodeString& appendTo,
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  FieldPosition& pos) const;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Format a long number. Concrete subclasses must implement
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * these pure virtual methods.
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param number    The value to be formatted.
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param appendTo  Output parameter to receive result.
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  Result is appended to existing contents.
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pos       On input: an alignment field, if desired.
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  On output: the offsets of the alignment field.
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          Reference to 'appendTo' parameter.
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    */
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeString& format(int32_t number,
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  UnicodeString& appendTo,
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  FieldPosition& pos) const;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Format an int64 number.
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param number    The value to be formatted.
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param appendTo  Output parameter to receive result.
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  Result is appended to existing contents.
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pos       On input: an alignment field, if desired.
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  On output: the offsets of the alignment field.
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          Reference to 'appendTo' parameter.
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    */
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeString& format(int64_t number,
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  UnicodeString& appendTo,
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  FieldPosition& pos) const;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Use the default behavior for the following.
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    virtual UnicodeString &format(double number, UnicodeString &appendTo) const;
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    virtual UnicodeString &format(int32_t number, UnicodeString &appendTo) const;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    virtual UnicodeString &format(int64_t number, UnicodeString &appendTo) const;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void parse(const UnicodeString& text, Formattable& result, ParsePosition& parsePosition) const;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the maximum number of digits allowed in the fraction portion of a
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * number. maximumFractionDigits must be >= minimumFractionDigits.  If the
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * new value for maximumFractionDigits is less than the current value
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of minimumFractionDigits, then minimumFractionDigits will also be set to
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the new value.
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param newValue    the new value to be set.
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see getMaximumFractionDigits
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void setMaximumFractionDigits(int32_t newValue);
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the minimum number of digits allowed in the fraction portion of a
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * number. minimumFractionDigits must be <= maximumFractionDigits.   If the
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * new value for minimumFractionDigits exceeds the current value
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of maximumFractionDigits, then maximumIntegerDigits will also be set to
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the new value
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param newValue    the new value to be set.
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see getMinimumFractionDigits
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void setMinimumFractionDigits(int32_t newValue);
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the class ID for this class. This is useful only for comparing to
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a return value from getDynamicClassID(). For example:
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <pre>
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * .   Base* polymorphic_pointer = createPolymorphicObject();
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * .   if (polymorphic_pointer->getDynamicClassID() ==
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * .       erived::getStaticClassID()) ...
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * </pre>
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          The class ID for all objects of this class.
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void);
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * method is to implement a simple version of RTTI, since not all C++
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * compilers support genuine RTTI. Polymorphic operator==() and clone()
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * methods call this method.
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          The class ID for this object. All objects of a
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  given class have the same class ID.  Objects of
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                  other classes have different class IDs.
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID(void) const;
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
146a4ce5bf56788dbb4835a5ef6143384266bbff5f5jshin@chromium.org    UnicodeString &format(int32_t numDigits, UnicodeString &appendTo, const wchar_t *format, ...) const;
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fCurrency;
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Locale fLocale;
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fLCID;
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FormatInfo *fFormatInfo;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fFractionDigitsSet;
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // U_PLATFORM_USES_ONLY_WIN32_API
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // __WINNMFMT
163