| // © 2020 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| |
| #ifndef __UNUMBERRANGEFORMATTER_H__ |
| #define __UNUMBERRANGEFORMATTER_H__ |
| |
| #include "unicode/utypes.h" |
| |
| #if !UCONFIG_NO_FORMATTING |
| |
| #include "unicode/parseerr.h" |
| #include "unicode/ufieldpositer.h" |
| #include "unicode/umisc.h" |
| #include "unicode/uformattedvalue.h" |
| #include "unicode/uformattable.h" |
| |
| |
| /** |
| * \file |
| * \brief C-compatible API for localized number range formatting. |
| * |
| * This is the C-compatible version of the NumberRangeFormatter API. C++ users |
| * should include unicode/numberrangeformatter.h and use the proper C++ APIs. |
| * |
| * First create a UNumberRangeFormatter, which is immutable, and then format to |
| * a UFormattedNumberRange. |
| * |
| * Example code: |
| * <pre> |
| * // Setup: |
| * UErrorCode ec = U_ZERO_ERROR; |
| * UNumberRangeFormatter* uformatter = unumrf_openForSkeletonCollapseIdentityFallbackAndLocaleWithError( |
| * u"currency/USD precision-integer", |
| * -1, |
| * UNUM_RANGE_COLLAPSE_AUTO, |
| * UNUM_IDENTITY_FALLBACK_APPROXIMATELY, |
| * "en-US", |
| * NULL, |
| * &ec); |
| * UFormattedNumberRange* uresult = unumrf_openResult(&ec); |
| * if (U_FAILURE(ec)) { return; } |
| * |
| * // Format a double range: |
| * unumrf_formatDoubleRange(uformatter, 3.0, 5.0, uresult, &ec); |
| * if (U_FAILURE(ec)) { return; } |
| * |
| * // Get the result string: |
| * int32_t len; |
| * const UChar* str = ufmtval_getString(unumrf_resultAsValue(uresult, &ec), &len, &ec); |
| * if (U_FAILURE(ec)) { return; } |
| * // str should equal "$3 – $5" |
| * |
| * // Cleanup: |
| * unumf_close(uformatter); |
| * unumf_closeResult(uresult); |
| * </pre> |
| * |
| * If you are a C++ user linking against the C libraries, you can use the LocalPointer versions of these |
| * APIs. The following example uses LocalPointer with the decimal number and field position APIs: |
| * |
| * <pre> |
| * // Setup: |
| * LocalUNumberRangeFormatterPointer uformatter( |
| * unumrf_openForSkeletonCollapseIdentityFallbackAndLocaleWithError(...)); |
| * LocalUFormattedNumberRangePointer uresult(unumrf_openResult(&ec)); |
| * if (U_FAILURE(ec)) { return; } |
| * |
| * // Format a double number range: |
| * unumrf_formatDoubleRange(uformatter.getAlias(), 3.0, 5.0, uresult.getAlias(), &ec); |
| * if (U_FAILURE(ec)) { return; } |
| * |
| * // No need to do any cleanup since we are using LocalPointer. |
| * </pre> |
| * |
| * You can also get field positions. For more information, see uformattedvalue.h. |
| */ |
| |
| /** |
| * Defines how to merge fields that are identical across the range sign. |
| * |
| * @stable ICU 63 |
| */ |
| typedef enum UNumberRangeCollapse { |
| /** |
| * Use locale data and heuristics to determine how much of the string to collapse. Could end up collapsing none, |
| * some, or all repeated pieces in a locale-sensitive way. |
| * |
| * The heuristics used for this option are subject to change over time. |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_RANGE_COLLAPSE_AUTO, |
| |
| /** |
| * Do not collapse any part of the number. Example: "3.2 thousand kilograms – 5.3 thousand kilograms" |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_RANGE_COLLAPSE_NONE, |
| |
| /** |
| * Collapse the unit part of the number, but not the notation, if present. Example: "3.2 thousand – 5.3 thousand |
| * kilograms" |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_RANGE_COLLAPSE_UNIT, |
| |
| /** |
| * Collapse any field that is equal across the range sign. May introduce ambiguity on the magnitude of the |
| * number. Example: "3.2 – 5.3 thousand kilograms" |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_RANGE_COLLAPSE_ALL |
| } UNumberRangeCollapse; |
| |
| /** |
| * Defines the behavior when the two numbers in the range are identical after rounding. To programmatically detect |
| * when the identity fallback is used, compare the lower and upper BigDecimals via FormattedNumber. |
| * |
| * @stable ICU 63 |
| * @see NumberRangeFormatter |
| */ |
| typedef enum UNumberRangeIdentityFallback { |
| /** |
| * Show the number as a single value rather than a range. Example: "$5" |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_IDENTITY_FALLBACK_SINGLE_VALUE, |
| |
| /** |
| * Show the number using a locale-sensitive approximation pattern. If the numbers were the same before rounding, |
| * show the single value. Example: "~$5" or "$5" |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE, |
| |
| /** |
| * Show the number using a locale-sensitive approximation pattern. Use the range pattern always, even if the |
| * inputs are the same. Example: "~$5" |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_IDENTITY_FALLBACK_APPROXIMATELY, |
| |
| /** |
| * Show the number as the range of two equal values. Use the range pattern always, even if the inputs are the |
| * same. Example (with RangeCollapse.NONE): "$5 – $5" |
| * |
| * @stable ICU 63 |
| */ |
| UNUM_IDENTITY_FALLBACK_RANGE |
| } UNumberRangeIdentityFallback; |
| |
| /** |
| * Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted in the range |
| * were equal or not, and whether or not the identity fallback was applied. |
| * |
| * @stable ICU 63 |
| * @see NumberRangeFormatter |
| */ |
| typedef enum UNumberRangeIdentityResult { |
| /** |
| * Used to indicate that the two numbers in the range were equal, even before any rounding rules were applied. |
| * |
| * @stable ICU 63 |
| * @see NumberRangeFormatter |
| */ |
| UNUM_IDENTITY_RESULT_EQUAL_BEFORE_ROUNDING, |
| |
| /** |
| * Used to indicate that the two numbers in the range were equal, but only after rounding rules were applied. |
| * |
| * @stable ICU 63 |
| * @see NumberRangeFormatter |
| */ |
| UNUM_IDENTITY_RESULT_EQUAL_AFTER_ROUNDING, |
| |
| /** |
| * Used to indicate that the two numbers in the range were not equal, even after rounding rules were applied. |
| * |
| * @stable ICU 63 |
| * @see NumberRangeFormatter |
| */ |
| UNUM_IDENTITY_RESULT_NOT_EQUAL, |
| |
| #ifndef U_HIDE_INTERNAL_API |
| /** |
| * The number of entries in this enum. |
| * @internal |
| */ |
| UNUM_IDENTITY_RESULT_COUNT |
| #endif |
| |
| } UNumberRangeIdentityResult; |
| |
| |
| #ifndef U_HIDE_DRAFT_API |
| |
| struct UNumberRangeFormatter; |
| /** |
| * C-compatible version of icu::number::LocalizedNumberRangeFormatter. |
| * |
| * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. |
| * |
| * @draft ICU 68 |
| */ |
| typedef struct UNumberRangeFormatter UNumberRangeFormatter; |
| |
| |
| struct UFormattedNumberRange; |
| /** |
| * C-compatible version of icu::number::FormattedNumberRange. |
| * |
| * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. |
| * |
| * @draft ICU 68 |
| */ |
| typedef struct UFormattedNumberRange UFormattedNumberRange; |
| |
| |
| /** |
| * Creates a new UNumberFormatter for the given skeleton string, collapse option, identity fallback |
| * option, and locale. This is currently the only method for creating a new UNumberRangeFormatter. |
| * |
| * Objects of type UNumberRangeFormatter returned by this method are threadsafe. |
| * |
| * For more details on skeleton strings, see the documentation in numberrangeformatter.h. For more |
| * details on the usage of this API, see the documentation at the top of unumberrangeformatter.h. |
| * |
| * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. |
| * |
| * @param skeleton The skeleton string, like u"percent precision-integer" |
| * @param skeletonLen The number of UChars in the skeleton string, or -1 if it is NUL-terminated. |
| * @param collapse Option for how to merge affixes (if unsure, use UNUM_RANGE_COLLAPSE_AUTO) |
| * @param identityFallback Option for resolving when both sides of the range are equal. |
| * @param locale The NUL-terminated locale ID. |
| * @param perror A parse error struct populated if an error occurs when parsing. Can be NULL. |
| * If no error occurs, perror->offset will be set to -1. |
| * @param ec Set if an error occurs. |
| * @draft ICU 68 |
| */ |
| U_CAPI UNumberRangeFormatter* U_EXPORT2 |
| unumrf_openForSkeletonWithCollapseAndIdentityFallback( |
| const UChar* skeleton, |
| int32_t skeletonLen, |
| UNumberRangeCollapse collapse, |
| UNumberRangeIdentityFallback identityFallback, |
| const char* locale, |
| UParseError* perror, |
| UErrorCode* ec); |
| |
| |
| /** |
| * Creates an object to hold the result of a UNumberRangeFormatter |
| * operation. The object can be used repeatedly; it is cleared whenever |
| * passed to a format function. |
| * |
| * @param ec Set if an error occurs. |
| * @draft ICU 68 |
| */ |
| U_CAPI UFormattedNumberRange* U_EXPORT2 |
| unumrf_openResult(UErrorCode* ec); |
| |
| |
| /** |
| * Uses a UNumberRangeFormatter to format a range of doubles. |
| * |
| * The UNumberRangeFormatter can be shared between threads. Each thread should have its own local |
| * UFormattedNumberRange, however, for storing the result of the formatting operation. |
| * |
| * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. |
| * |
| * @param uformatter A formatter object; see unumberrangeformatter.h. |
| * @param first The first (usually smaller) number in the range. |
| * @param second The second (usually larger) number in the range. |
| * @param uresult The object that will be mutated to store the result; see unumrf_openResult. |
| * @param ec Set if an error occurs. |
| * @draft ICU 68 |
| */ |
| U_CAPI void U_EXPORT2 |
| unumrf_formatDoubleRange( |
| const UNumberRangeFormatter* uformatter, |
| double first, |
| double second, |
| UFormattedNumberRange* uresult, |
| UErrorCode* ec); |
| |
| |
| /** |
| * Uses a UNumberRangeFormatter to format a range of decimal numbers. |
| * |
| * With a decimal number string, you can specify an input with arbitrary precision. |
| * |
| * The UNumberRangeFormatter can be shared between threads. Each thread should have its own local |
| * UFormattedNumberRange, however, for storing the result of the formatting operation. |
| * |
| * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. |
| * |
| * @param uformatter A formatter object; see unumberrangeformatter.h. |
| * @param first The first (usually smaller) number in the range. |
| * @param firstLen The length of the first decimal number string. |
| * @param second The second (usually larger) number in the range. |
| * @param secondLen The length of the second decimal number string. |
| * @param uresult The object that will be mutated to store the result; see unumrf_openResult. |
| * @param ec Set if an error occurs. |
| * @draft ICU 68 |
| */ |
| U_CAPI void U_EXPORT2 |
| unumrf_formatDecimalRange( |
| const UNumberRangeFormatter* uformatter, |
| const char* first, |
| int32_t firstLen, |
| const char* second, |
| int32_t secondLen, |
| UFormattedNumberRange* uresult, |
| UErrorCode* ec); |
| |
| |
| /** |
| * Returns a representation of a UFormattedNumberRange as a UFormattedValue, |
| * which can be subsequently passed to any API requiring that type. |
| * |
| * The returned object is owned by the UFormattedNumberRange and is valid |
| * only as long as the UFormattedNumber is present and unchanged in memory. |
| * |
| * You can think of this method as a cast between types. |
| * |
| * @param uresult The object containing the formatted number range. |
| * @param ec Set if an error occurs. |
| * @return A UFormattedValue owned by the input object. |
| * @draft ICU 68 |
| */ |
| U_CAPI const UFormattedValue* U_EXPORT2 |
| unumrf_resultAsValue(const UFormattedNumberRange* uresult, UErrorCode* ec); |
| |
| |
| /** |
| * Extracts the identity result from a UFormattedNumberRange. |
| * |
| * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. |
| * |
| * @param uresult The object containing the formatted number range. |
| * @param ec Set if an error occurs. |
| * @return The identity result; see UNumberRangeIdentityResult. |
| * @draft ICU 68 |
| */ |
| U_CAPI UNumberRangeIdentityResult U_EXPORT2 |
| unumrf_resultGetIdentityResult( |
| const UFormattedNumberRange* uresult, |
| UErrorCode* ec); |
| |
| |
| #ifndef U_HIDE_DRAFT_API |
| /** |
| * Extracts the first formatted number as a decimal number. This endpoint |
| * is useful for obtaining the exact number being printed after scaling |
| * and rounding have been applied by the number range formatting pipeline. |
| * |
| * The syntax of the unformatted number is a "numeric string" |
| * as defined in the Decimal Arithmetic Specification, available at |
| * http://speleotrove.com/decimal |
| * |
| * @param uresult The input object containing the formatted number range. |
| * @param dest the 8-bit char buffer into which the decimal number is placed |
| * @param destCapacity The size, in chars, of the destination buffer. May be zero |
| * for precomputing the required size. |
| * @param ec receives any error status. |
| * If U_BUFFER_OVERFLOW_ERROR: Returns number of chars for |
| * preflighting. |
| * @return Number of chars in the data. Does not include a trailing NUL. |
| * @draft ICU 68 |
| */ |
| U_CAPI int32_t U_EXPORT2 |
| unumrf_resultGetFirstDecimalNumber( |
| const UFormattedNumberRange* uresult, |
| char* dest, |
| int32_t destCapacity, |
| UErrorCode* ec); |
| |
| |
| /** |
| * Extracts the second formatted number as a decimal number. This endpoint |
| * is useful for obtaining the exact number being printed after scaling |
| * and rounding have been applied by the number range formatting pipeline. |
| * |
| * The syntax of the unformatted number is a "numeric string" |
| * as defined in the Decimal Arithmetic Specification, available at |
| * http://speleotrove.com/decimal |
| * |
| * @param uresult The input object containing the formatted number range. |
| * @param dest the 8-bit char buffer into which the decimal number is placed |
| * @param destCapacity The size, in chars, of the destination buffer. May be zero |
| * for precomputing the required size. |
| * @param ec receives any error status. |
| * If U_BUFFER_OVERFLOW_ERROR: Returns number of chars for |
| * preflighting. |
| * @return Number of chars in the data. Does not include a trailing NUL. |
| * @draft ICU 68 |
| */ |
| U_CAPI int32_t U_EXPORT2 |
| unumrf_resultGetSecondDecimalNumber( |
| const UFormattedNumberRange* uresult, |
| char* dest, |
| int32_t destCapacity, |
| UErrorCode* ec); |
| #endif // U_HIDE_DRAFT_API |
| |
| |
| /** |
| * Releases the UNumberFormatter created by unumf_openForSkeletonAndLocale(). |
| * |
| * @param uformatter An object created by unumf_openForSkeletonAndLocale(). |
| * @draft ICU 68 |
| */ |
| U_CAPI void U_EXPORT2 |
| unumrf_close(UNumberRangeFormatter* uformatter); |
| |
| |
| /** |
| * Releases the UFormattedNumber created by unumf_openResult(). |
| * |
| * @param uresult An object created by unumf_openResult(). |
| * @draft ICU 68 |
| */ |
| U_CAPI void U_EXPORT2 |
| unumrf_closeResult(UFormattedNumberRange* uresult); |
| |
| |
| #if U_SHOW_CPLUSPLUS_API |
| U_NAMESPACE_BEGIN |
| |
| /** |
| * \class LocalUNumberRangeFormatterPointer |
| * "Smart pointer" class; closes a UNumberFormatter via unumf_close(). |
| * For most methods see the LocalPointerBase base class. |
| * |
| * Usage: |
| * <pre> |
| * LocalUNumberRangeFormatterPointer uformatter( |
| * unumrf_openForSkeletonCollapseIdentityFallbackAndLocaleWithError(...)); |
| * // no need to explicitly call unumrf_close() |
| * </pre> |
| * |
| * @see LocalPointerBase |
| * @see LocalPointer |
| * @draft ICU 68 |
| */ |
| U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberRangeFormatterPointer, UNumberRangeFormatter, unumrf_close); |
| |
| /** |
| * \class LocalUFormattedNumberPointer |
| * "Smart pointer" class; closes a UFormattedNumber via unumf_closeResult(). |
| * For most methods see the LocalPointerBase base class. |
| * |
| * Usage: |
| * <pre> |
| * LocalUFormattedNumberRangePointer uresult(unumrf_openResult(...)); |
| * // no need to explicitly call unumrf_closeResult() |
| * </pre> |
| * |
| * @see LocalPointerBase |
| * @see LocalPointer |
| * @draft ICU 68 |
| */ |
| U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedNumberRangePointer, UFormattedNumberRange, unumrf_closeResult); |
| |
| U_NAMESPACE_END |
| #endif // U_SHOW_CPLUSPLUS_API |
| |
| #endif // U_HIDE_DRAFT_API |
| |
| #endif /* #if !UCONFIG_NO_FORMATTING */ |
| #endif //__UNUMBERRANGEFORMATTER_H__ |