Spaces:
Sleeping
Sleeping
// © 2022 and later: Unicode, Inc. and others. | |
// License & terms of use: http://www.unicode.org/copyright.html | |
/** | |
* \file | |
* \brief C API: Formatted number result from various number formatting functions. | |
* | |
* See also {@link icu::FormattedValue} for additional things you can do with a FormattedNumber. | |
*/ | |
U_NAMESPACE_BEGIN | |
class FieldPositionIteratorHandler; | |
namespace number { // icu::number | |
namespace impl { | |
class DecimalQuantity; | |
class UFormattedNumberData; | |
struct UFormattedNumberImpl; | |
} // icu::number::impl | |
/** | |
* The result of a number formatting operation. This class allows the result to be exported in several data types, | |
* including a UnicodeString and a FieldPositionIterator. | |
* | |
* Instances of this class are immutable and thread-safe. | |
* | |
* @stable ICU 60 | |
*/ | |
class U_I18N_API FormattedNumber : public UMemory, public FormattedValue { | |
public: | |
/** | |
* Default constructor; makes an empty FormattedNumber. | |
* @stable ICU 64 | |
*/ | |
FormattedNumber() | |
: fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {} | |
/** | |
* Move constructor: Leaves the source FormattedNumber in an undefined state. | |
* @stable ICU 62 | |
*/ | |
FormattedNumber(FormattedNumber&& src) noexcept; | |
/** | |
* Destruct an instance of FormattedNumber. | |
* @stable ICU 60 | |
*/ | |
virtual ~FormattedNumber() override; | |
/** Copying not supported; use move constructor instead. */ | |
FormattedNumber(const FormattedNumber&) = delete; | |
/** Copying not supported; use move assignment instead. */ | |
FormattedNumber& operator=(const FormattedNumber&) = delete; | |
/** | |
* Move assignment: Leaves the source FormattedNumber in an undefined state. | |
* @stable ICU 62 | |
*/ | |
FormattedNumber& operator=(FormattedNumber&& src) noexcept; | |
// Copybrief: this method is older than the parent method | |
/** | |
* @copybrief FormattedValue::toString() | |
* | |
* For more information, see FormattedValue::toString() | |
* | |
* @stable ICU 62 | |
*/ | |
UnicodeString toString(UErrorCode& status) const override; | |
// Copydoc: this method is new in ICU 64 | |
/** @copydoc FormattedValue::toTempString() */ | |
UnicodeString toTempString(UErrorCode& status) const override; | |
// Copybrief: this method is older than the parent method | |
/** | |
* @copybrief FormattedValue::appendTo() | |
* | |
* For more information, see FormattedValue::appendTo() | |
* | |
* @stable ICU 62 | |
*/ | |
Appendable &appendTo(Appendable& appendable, UErrorCode& status) const override; | |
// Copydoc: this method is new in ICU 64 | |
/** @copydoc FormattedValue::nextPosition() */ | |
UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override; | |
/** | |
* Export the formatted number as a "numeric string" conforming to the | |
* syntax defined in the Decimal Arithmetic Specification, available at | |
* http://speleotrove.com/decimal | |
* | |
* This endpoint is useful for obtaining the exact number being printed | |
* after scaling and rounding have been applied by the number formatter. | |
* | |
* Example call site: | |
* | |
* auto decimalNumber = fn.toDecimalNumber<std::string>(status); | |
* | |
* @tparam StringClass A string class compatible with StringByteSink; | |
* for example, std::string. | |
* @param status Set if an error occurs. | |
* @return A StringClass containing the numeric string. | |
* @stable ICU 65 | |
*/ | |
template<typename StringClass> | |
inline StringClass toDecimalNumber(UErrorCode& status) const; | |
/** | |
* Gets the resolved output unit. | |
* | |
* The output unit is dependent upon the localized preferences for the usage | |
* specified via NumberFormatterSettings::usage(), and may be a unit with | |
* UMEASURE_UNIT_MIXED unit complexity (MeasureUnit::getComplexity()), such | |
* as "foot-and-inch" or "hour-and-minute-and-second". | |
* | |
* @return `MeasureUnit`. | |
* @stable ICU 68 | |
*/ | |
MeasureUnit getOutputUnit(UErrorCode& status) const; | |
/** | |
* Gets the noun class of the formatted output. Returns `UNDEFINED` when the noun class | |
* is not supported yet. | |
* | |
* @return UDisplayOptionsNounClass | |
* @draft ICU 72 | |
*/ | |
UDisplayOptionsNounClass getNounClass(UErrorCode &status) const; | |
/** | |
* Gets the raw DecimalQuantity for plural rule selection. | |
* @internal | |
*/ | |
void getDecimalQuantity(impl::DecimalQuantity& output, UErrorCode& status) const; | |
/** | |
* Populates the mutable builder type FieldPositionIteratorHandler. | |
* @internal | |
*/ | |
void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, UErrorCode& status) const; | |
private: | |
// Can't use LocalPointer because UFormattedNumberData is forward-declared | |
impl::UFormattedNumberData *fData; | |
// Error code for the terminal methods | |
UErrorCode fErrorCode; | |
/** | |
* Internal constructor from data type. Adopts the data pointer. | |
* @internal (private) | |
*/ | |
explicit FormattedNumber(impl::UFormattedNumberData *results) | |
: fData(results), fErrorCode(U_ZERO_ERROR) {} | |
explicit FormattedNumber(UErrorCode errorCode) | |
: fData(nullptr), fErrorCode(errorCode) {} | |
void toDecimalNumber(ByteSink& sink, UErrorCode& status) const; | |
// To give LocalizedNumberFormatter format methods access to this class's constructor: | |
friend class LocalizedNumberFormatter; | |
friend class SimpleNumberFormatter; | |
// To give C API access to internals | |
friend struct impl::UFormattedNumberImpl; | |
}; | |
template<typename StringClass> | |
StringClass FormattedNumber::toDecimalNumber(UErrorCode& status) const { | |
StringClass result; | |
StringByteSink<StringClass> sink(&result); | |
toDecimalNumber(sink, status); | |
return result; | |
} | |
} // namespace number | |
U_NAMESPACE_END | |