Index: source/i18n/valueformatter.h |
diff --git a/source/i18n/valueformatter.h b/source/i18n/valueformatter.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e985edd390e77007a8f9f698ff2d8bc33c6a14ca |
--- /dev/null |
+++ b/source/i18n/valueformatter.h |
@@ -0,0 +1,159 @@ |
+/* |
+******************************************************************************* |
+* Copyright (C) 2015, International Business Machines Corporation and * |
+* others. All Rights Reserved. * |
+******************************************************************************* |
+*/ |
+ |
+#ifndef VALUEFORMATTER_H |
+#define VALUEFORMATTER_H |
+ |
+#if !UCONFIG_NO_FORMATTING |
+ |
+#include "unicode/uobject.h" |
+#include "unicode/utypes.h" |
+ |
+ |
+ |
+U_NAMESPACE_BEGIN |
+ |
+class UnicodeString; |
+class DigitList; |
+class FieldPositionHandler; |
+class DigitGrouping; |
+class PluralRules; |
+class FixedPrecision; |
+class DigitFormatter; |
+class DigitFormatterOptions; |
+class ScientificPrecision; |
+class SciFormatterOptions; |
+class FixedDecimal; |
+class VisibleDigitsWithExponent; |
+ |
+ |
+/** |
+ * A closure around rounding and formatting a value. As these instances are |
+ * designed to be short lived (they only exist while formatting a value), they |
+ * do not own their own attributes. Rather the caller maintains ownership of |
+ * all attributes. A caller first calls a prepareXXX method on an instance |
+ * to share its data before using that instance. Using an |
+ * instance without first calling a prepareXXX method results in an |
+ * assertion error and a program crash. |
+ */ |
+class U_I18N_API ValueFormatter : public UObject { |
+public: |
+ ValueFormatter() : fType(kFormatTypeCount) { |
+ } |
+ |
+ virtual ~ValueFormatter(); |
+ |
+ /** |
+ * This function is here only to support the protected round() method |
+ * in DecimalFormat. It serves no ther purpose than that. |
+ * |
+ * @param value this value is rounded in place. |
+ * @param status any error returned here. |
+ */ |
+ DigitList &round(DigitList &value, UErrorCode &status) const; |
+ |
+ /** |
+ * Returns TRUE if the absolute value of value can be fast formatted |
+ * using ValueFormatter::formatInt32. |
+ */ |
+ UBool isFastFormattable(int32_t value) const; |
+ |
+ /** |
+ * Converts value to a VisibleDigitsWithExponent. |
+ * Result may be fixed point or scientific. |
+ */ |
+ VisibleDigitsWithExponent &toVisibleDigitsWithExponent( |
+ int64_t value, |
+ VisibleDigitsWithExponent &digits, |
+ UErrorCode &status) const; |
+ |
+ /** |
+ * Converts value to a VisibleDigitsWithExponent. |
+ * Result may be fixed point or scientific. |
+ */ |
+ VisibleDigitsWithExponent &toVisibleDigitsWithExponent( |
+ DigitList &value, |
+ VisibleDigitsWithExponent &digits, |
+ UErrorCode &status) const; |
+ |
+ /** |
+ * formats positiveValue and appends to appendTo. Returns appendTo. |
+ * @param positiveValue If negative, no negative sign is formatted. |
+ * @param handler stores the field positions |
+ * @param appendTo formatted value appended here. |
+ */ |
+ UnicodeString &format( |
+ const VisibleDigitsWithExponent &positiveValue, |
+ FieldPositionHandler &handler, |
+ UnicodeString &appendTo) const; |
+ |
+ |
+ /** |
+ * formats positiveValue and appends to appendTo. Returns appendTo. |
+ * value must be positive. Calling formatInt32 to format a value when |
+ * isFastFormattable indicates that the value cannot be fast formatted |
+ * results in undefined behavior. |
+ */ |
+ UnicodeString &formatInt32( |
+ int32_t positiveValue, |
+ FieldPositionHandler &handler, |
+ UnicodeString &appendTo) const; |
+ |
+ /** |
+ * Returns the number of code points needed to format. |
+ * @param positiveValue if negative, the negative sign is not included |
+ * in count. |
+ */ |
+ int32_t countChar32( |
+ const VisibleDigitsWithExponent &positiveValue) const; |
+ |
+ /** |
+ * Prepares this instance for fixed decimal formatting. |
+ */ |
+ void prepareFixedDecimalFormatting( |
+ const DigitFormatter &formatter, |
+ const DigitGrouping &grouping, |
+ const FixedPrecision &precision, |
+ const DigitFormatterOptions &options); |
+ |
+ /** |
+ * Prepares this instance for scientific formatting. |
+ */ |
+ void prepareScientificFormatting( |
+ const DigitFormatter &formatter, |
+ const ScientificPrecision &precision, |
+ const SciFormatterOptions &options); |
+ |
+private: |
+ ValueFormatter(const ValueFormatter &); |
+ ValueFormatter &operator=(const ValueFormatter &); |
+ enum FormatType { |
+ kFixedDecimal, |
+ kScientificNotation, |
+ kFormatTypeCount |
+ }; |
+ |
+ FormatType fType; |
+ |
+ // for fixed decimal and scientific formatting |
+ const DigitFormatter *fDigitFormatter; |
+ |
+ // for fixed decimal formatting |
+ const FixedPrecision *fFixedPrecision; |
+ const DigitFormatterOptions *fFixedOptions; |
+ const DigitGrouping *fGrouping; |
+ |
+ // for scientific formatting |
+ const ScientificPrecision *fScientificPrecision; |
+ const SciFormatterOptions *fScientificOptions; |
+}; |
+ |
+U_NAMESPACE_END |
+ |
+#endif /* !UCONFIG_NO_FORMATTING */ |
+ |
+#endif /* VALUEFORMATTER_H */ |