1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
******************************************************************************
* Copyright (C) 2014-2016, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* quantityformatter.h
*/
#ifndef __QUANTITY_FORMATTER_H__
#define __QUANTITY_FORMATTER_H__
#include <_foundation_unicode/utypes.h>
#include <_foundation_unicode/uobject.h>
#if !UCONFIG_NO_FORMATTING
#include "standardplural.h"
U_NAMESPACE_BEGIN
class SimpleFormatter;
class UnicodeString;
class PluralRules;
class NumberFormat;
class Formattable;
class FieldPosition;
class FormattedStringBuilder;
/**
* A plural aware formatter that is good for expressing a single quantity and
* a unit.
* <p>
* First use the add() methods to add a pattern for each plural variant.
* There must be a pattern for the "other" variant.
* Then use the format() method.
* <p>
* Concurrent calls only to const methods on a QuantityFormatter object are
* safe, but concurrent const and non-const method calls on a QuantityFormatter
* object are not safe and require synchronization.
*
*/
class U_I18N_API QuantityFormatter : public UMemory {
public:
/**
* Default constructor.
*/
QuantityFormatter();
/**
* Copy constructor.
*/
QuantityFormatter(const QuantityFormatter& other);
/**
* Assignment operator
*/
QuantityFormatter &operator=(const QuantityFormatter& other);
/**
* Destructor.
*/
~QuantityFormatter();
/**
* Removes all variants from this object including the "other" variant.
*/
void reset();
/**
* Adds a plural variant if there is none yet for the plural form.
*
* @param variant "zero", "one", "two", "few", "many", "other"
* @param rawPattern the pattern for the variant e.g "{0} meters"
* @param status any error returned here.
* @return true on success; false if status was set to a non zero error.
*/
UBool addIfAbsent(const char *variant, const UnicodeString &rawPattern, UErrorCode &status);
/**
* returns true if this object has at least the "other" variant.
*/
UBool isValid() const;
/**
* Gets the pattern formatter that would be used for a particular variant.
* If isValid() returns true, this method is guaranteed to return a
* non-nullptr value.
*/
const SimpleFormatter *getByVariant(const char *variant) const;
/**
* Formats a number with this object appending the result to appendTo.
* At least the "other" variant must be added to this object for this
* method to work.
*
* @param number the single number.
* @param fmt formats the number
* @param rules computes the plural variant to use.
* @param appendTo result appended here.
* @param status any error returned here.
* @return appendTo
*/
UnicodeString &format(
const Formattable &number,
const NumberFormat &fmt,
const PluralRules &rules,
UnicodeString &appendTo,
FieldPosition &pos,
UErrorCode &status) const;
/**
* Selects the standard plural form for the number/formatter/rules.
* Used in MeasureFormat for backwards compatibility with NumberFormat.
*/
static StandardPlural::Form selectPlural(
const Formattable &number,
const NumberFormat &fmt,
const PluralRules &rules,
UnicodeString &formattedNumber,
FieldPosition &pos,
UErrorCode &status);
/**
* Formats a quantity and selects its plural form. The output is appended
* to a FormattedStringBuilder in order to retain field information.
*
* @param quantity The number to format.
* @param fmt The formatter to use to format the number.
* @param rules The rules to use to select the plural form of the
* formatted number.
* @param output Where to append the result of the format operation.
* @param pluralForm Output variable populated with the plural form of the
* formatted number.
* @param status Set if an error occurs.
*/
static void formatAndSelect(
double quantity,
const NumberFormat& fmt,
const PluralRules& rules,
FormattedStringBuilder& output,
StandardPlural::Form& pluralForm,
UErrorCode& status);
/**
* Formats the pattern with the value and adjusts the FieldPosition.
* TODO: Remove?
*/
static UnicodeString &format(
const SimpleFormatter &pattern,
const UnicodeString &value,
UnicodeString &appendTo,
FieldPosition &pos,
UErrorCode &status);
private:
SimpleFormatter *formatters[StandardPlural::COUNT];
};
U_NAMESPACE_END
#endif
#endif
|