1*0e209d39SAndroid Build Coastguard Worker // © 2020 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker 4*0e209d39SAndroid Build Coastguard Worker #ifndef __UNUMBERRANGEFORMATTER_H__ 5*0e209d39SAndroid Build Coastguard Worker #define __UNUMBERRANGEFORMATTER_H__ 6*0e209d39SAndroid Build Coastguard Worker 7*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 8*0e209d39SAndroid Build Coastguard Worker 9*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 10*0e209d39SAndroid Build Coastguard Worker 11*0e209d39SAndroid Build Coastguard Worker #include "unicode/parseerr.h" 12*0e209d39SAndroid Build Coastguard Worker #include "unicode/ufieldpositer.h" 13*0e209d39SAndroid Build Coastguard Worker #include "unicode/umisc.h" 14*0e209d39SAndroid Build Coastguard Worker #include "unicode/uformattedvalue.h" 15*0e209d39SAndroid Build Coastguard Worker #include "unicode/uformattable.h" 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker 18*0e209d39SAndroid Build Coastguard Worker /** 19*0e209d39SAndroid Build Coastguard Worker * \file 20*0e209d39SAndroid Build Coastguard Worker * \brief C API: Localized number range formatting 21*0e209d39SAndroid Build Coastguard Worker * 22*0e209d39SAndroid Build Coastguard Worker * This is the C-compatible version of the NumberRangeFormatter API. C++ users 23*0e209d39SAndroid Build Coastguard Worker * should include unicode/numberrangeformatter.h and use the proper C++ APIs. 24*0e209d39SAndroid Build Coastguard Worker * 25*0e209d39SAndroid Build Coastguard Worker * First create a UNumberRangeFormatter, which is immutable, and then format to 26*0e209d39SAndroid Build Coastguard Worker * a UFormattedNumberRange. 27*0e209d39SAndroid Build Coastguard Worker * 28*0e209d39SAndroid Build Coastguard Worker * Example code: 29*0e209d39SAndroid Build Coastguard Worker * <pre> 30*0e209d39SAndroid Build Coastguard Worker * // Setup: 31*0e209d39SAndroid Build Coastguard Worker * UErrorCode ec = U_ZERO_ERROR; 32*0e209d39SAndroid Build Coastguard Worker * UNumberRangeFormatter* uformatter = unumrf_openForSkeletonCollapseIdentityFallbackAndLocaleWithError( 33*0e209d39SAndroid Build Coastguard Worker * u"currency/USD precision-integer", 34*0e209d39SAndroid Build Coastguard Worker * -1, 35*0e209d39SAndroid Build Coastguard Worker * UNUM_RANGE_COLLAPSE_AUTO, 36*0e209d39SAndroid Build Coastguard Worker * UNUM_IDENTITY_FALLBACK_APPROXIMATELY, 37*0e209d39SAndroid Build Coastguard Worker * "en-US", 38*0e209d39SAndroid Build Coastguard Worker * NULL, 39*0e209d39SAndroid Build Coastguard Worker * &ec); 40*0e209d39SAndroid Build Coastguard Worker * UFormattedNumberRange* uresult = unumrf_openResult(&ec); 41*0e209d39SAndroid Build Coastguard Worker * if (U_FAILURE(ec)) { return; } 42*0e209d39SAndroid Build Coastguard Worker * 43*0e209d39SAndroid Build Coastguard Worker * // Format a double range: 44*0e209d39SAndroid Build Coastguard Worker * unumrf_formatDoubleRange(uformatter, 3.0, 5.0, uresult, &ec); 45*0e209d39SAndroid Build Coastguard Worker * if (U_FAILURE(ec)) { return; } 46*0e209d39SAndroid Build Coastguard Worker * 47*0e209d39SAndroid Build Coastguard Worker * // Get the result string: 48*0e209d39SAndroid Build Coastguard Worker * int32_t len; 49*0e209d39SAndroid Build Coastguard Worker * const UChar* str = ufmtval_getString(unumrf_resultAsValue(uresult, &ec), &len, &ec); 50*0e209d39SAndroid Build Coastguard Worker * if (U_FAILURE(ec)) { return; } 51*0e209d39SAndroid Build Coastguard Worker * // str should equal "$3 – $5" 52*0e209d39SAndroid Build Coastguard Worker * 53*0e209d39SAndroid Build Coastguard Worker * // Cleanup: 54*0e209d39SAndroid Build Coastguard Worker * unumf_close(uformatter); 55*0e209d39SAndroid Build Coastguard Worker * unumf_closeResult(uresult); 56*0e209d39SAndroid Build Coastguard Worker * </pre> 57*0e209d39SAndroid Build Coastguard Worker * 58*0e209d39SAndroid Build Coastguard Worker * If you are a C++ user linking against the C libraries, you can use the LocalPointer versions of these 59*0e209d39SAndroid Build Coastguard Worker * APIs. The following example uses LocalPointer with the decimal number and field position APIs: 60*0e209d39SAndroid Build Coastguard Worker * 61*0e209d39SAndroid Build Coastguard Worker * <pre> 62*0e209d39SAndroid Build Coastguard Worker * // Setup: 63*0e209d39SAndroid Build Coastguard Worker * LocalUNumberRangeFormatterPointer uformatter( 64*0e209d39SAndroid Build Coastguard Worker * unumrf_openForSkeletonCollapseIdentityFallbackAndLocaleWithError(...)); 65*0e209d39SAndroid Build Coastguard Worker * LocalUFormattedNumberRangePointer uresult(unumrf_openResult(&ec)); 66*0e209d39SAndroid Build Coastguard Worker * if (U_FAILURE(ec)) { return; } 67*0e209d39SAndroid Build Coastguard Worker * 68*0e209d39SAndroid Build Coastguard Worker * // Format a double number range: 69*0e209d39SAndroid Build Coastguard Worker * unumrf_formatDoubleRange(uformatter.getAlias(), 3.0, 5.0, uresult.getAlias(), &ec); 70*0e209d39SAndroid Build Coastguard Worker * if (U_FAILURE(ec)) { return; } 71*0e209d39SAndroid Build Coastguard Worker * 72*0e209d39SAndroid Build Coastguard Worker * // No need to do any cleanup since we are using LocalPointer. 73*0e209d39SAndroid Build Coastguard Worker * </pre> 74*0e209d39SAndroid Build Coastguard Worker * 75*0e209d39SAndroid Build Coastguard Worker * You can also get field positions. For more information, see uformattedvalue.h. 76*0e209d39SAndroid Build Coastguard Worker */ 77*0e209d39SAndroid Build Coastguard Worker 78*0e209d39SAndroid Build Coastguard Worker /** 79*0e209d39SAndroid Build Coastguard Worker * Defines how to merge fields that are identical across the range sign. 80*0e209d39SAndroid Build Coastguard Worker * 81*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 82*0e209d39SAndroid Build Coastguard Worker */ 83*0e209d39SAndroid Build Coastguard Worker typedef enum UNumberRangeCollapse { 84*0e209d39SAndroid Build Coastguard Worker /** 85*0e209d39SAndroid Build Coastguard Worker * Use locale data and heuristics to determine how much of the string to collapse. Could end up collapsing none, 86*0e209d39SAndroid Build Coastguard Worker * some, or all repeated pieces in a locale-sensitive way. 87*0e209d39SAndroid Build Coastguard Worker * 88*0e209d39SAndroid Build Coastguard Worker * The heuristics used for this option are subject to change over time. 89*0e209d39SAndroid Build Coastguard Worker * 90*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 91*0e209d39SAndroid Build Coastguard Worker */ 92*0e209d39SAndroid Build Coastguard Worker UNUM_RANGE_COLLAPSE_AUTO, 93*0e209d39SAndroid Build Coastguard Worker 94*0e209d39SAndroid Build Coastguard Worker /** 95*0e209d39SAndroid Build Coastguard Worker * Do not collapse any part of the number. Example: "3.2 thousand kilograms – 5.3 thousand kilograms" 96*0e209d39SAndroid Build Coastguard Worker * 97*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 98*0e209d39SAndroid Build Coastguard Worker */ 99*0e209d39SAndroid Build Coastguard Worker UNUM_RANGE_COLLAPSE_NONE, 100*0e209d39SAndroid Build Coastguard Worker 101*0e209d39SAndroid Build Coastguard Worker /** 102*0e209d39SAndroid Build Coastguard Worker * Collapse the unit part of the number, but not the notation, if present. Example: "3.2 thousand – 5.3 thousand 103*0e209d39SAndroid Build Coastguard Worker * kilograms" 104*0e209d39SAndroid Build Coastguard Worker * 105*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 106*0e209d39SAndroid Build Coastguard Worker */ 107*0e209d39SAndroid Build Coastguard Worker UNUM_RANGE_COLLAPSE_UNIT, 108*0e209d39SAndroid Build Coastguard Worker 109*0e209d39SAndroid Build Coastguard Worker /** 110*0e209d39SAndroid Build Coastguard Worker * Collapse any field that is equal across the range sign. May introduce ambiguity on the magnitude of the 111*0e209d39SAndroid Build Coastguard Worker * number. Example: "3.2 – 5.3 thousand kilograms" 112*0e209d39SAndroid Build Coastguard Worker * 113*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 114*0e209d39SAndroid Build Coastguard Worker */ 115*0e209d39SAndroid Build Coastguard Worker UNUM_RANGE_COLLAPSE_ALL 116*0e209d39SAndroid Build Coastguard Worker } UNumberRangeCollapse; 117*0e209d39SAndroid Build Coastguard Worker 118*0e209d39SAndroid Build Coastguard Worker /** 119*0e209d39SAndroid Build Coastguard Worker * Defines the behavior when the two numbers in the range are identical after rounding. To programmatically detect 120*0e209d39SAndroid Build Coastguard Worker * when the identity fallback is used, compare the lower and upper BigDecimals via FormattedNumber. 121*0e209d39SAndroid Build Coastguard Worker * 122*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 123*0e209d39SAndroid Build Coastguard Worker * @see NumberRangeFormatter 124*0e209d39SAndroid Build Coastguard Worker */ 125*0e209d39SAndroid Build Coastguard Worker typedef enum UNumberRangeIdentityFallback { 126*0e209d39SAndroid Build Coastguard Worker /** 127*0e209d39SAndroid Build Coastguard Worker * Show the number as a single value rather than a range. Example: "$5" 128*0e209d39SAndroid Build Coastguard Worker * 129*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 130*0e209d39SAndroid Build Coastguard Worker */ 131*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_FALLBACK_SINGLE_VALUE, 132*0e209d39SAndroid Build Coastguard Worker 133*0e209d39SAndroid Build Coastguard Worker /** 134*0e209d39SAndroid Build Coastguard Worker * Show the number using a locale-sensitive approximation pattern. If the numbers were the same before rounding, 135*0e209d39SAndroid Build Coastguard Worker * show the single value. Example: "~$5" or "$5" 136*0e209d39SAndroid Build Coastguard Worker * 137*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 138*0e209d39SAndroid Build Coastguard Worker */ 139*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE, 140*0e209d39SAndroid Build Coastguard Worker 141*0e209d39SAndroid Build Coastguard Worker /** 142*0e209d39SAndroid Build Coastguard Worker * Show the number using a locale-sensitive approximation pattern. Use the range pattern always, even if the 143*0e209d39SAndroid Build Coastguard Worker * inputs are the same. Example: "~$5" 144*0e209d39SAndroid Build Coastguard Worker * 145*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 146*0e209d39SAndroid Build Coastguard Worker */ 147*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_FALLBACK_APPROXIMATELY, 148*0e209d39SAndroid Build Coastguard Worker 149*0e209d39SAndroid Build Coastguard Worker /** 150*0e209d39SAndroid Build Coastguard Worker * Show the number as the range of two equal values. Use the range pattern always, even if the inputs are the 151*0e209d39SAndroid Build Coastguard Worker * same. Example (with RangeCollapse.NONE): "$5 – $5" 152*0e209d39SAndroid Build Coastguard Worker * 153*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 154*0e209d39SAndroid Build Coastguard Worker */ 155*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_FALLBACK_RANGE 156*0e209d39SAndroid Build Coastguard Worker } UNumberRangeIdentityFallback; 157*0e209d39SAndroid Build Coastguard Worker 158*0e209d39SAndroid Build Coastguard Worker /** 159*0e209d39SAndroid Build Coastguard Worker * Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted in the range 160*0e209d39SAndroid Build Coastguard Worker * were equal or not, and whether or not the identity fallback was applied. 161*0e209d39SAndroid Build Coastguard Worker * 162*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 163*0e209d39SAndroid Build Coastguard Worker * @see NumberRangeFormatter 164*0e209d39SAndroid Build Coastguard Worker */ 165*0e209d39SAndroid Build Coastguard Worker typedef enum UNumberRangeIdentityResult { 166*0e209d39SAndroid Build Coastguard Worker /** 167*0e209d39SAndroid Build Coastguard Worker * Used to indicate that the two numbers in the range were equal, even before any rounding rules were applied. 168*0e209d39SAndroid Build Coastguard Worker * 169*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 170*0e209d39SAndroid Build Coastguard Worker * @see NumberRangeFormatter 171*0e209d39SAndroid Build Coastguard Worker */ 172*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_RESULT_EQUAL_BEFORE_ROUNDING, 173*0e209d39SAndroid Build Coastguard Worker 174*0e209d39SAndroid Build Coastguard Worker /** 175*0e209d39SAndroid Build Coastguard Worker * Used to indicate that the two numbers in the range were equal, but only after rounding rules were applied. 176*0e209d39SAndroid Build Coastguard Worker * 177*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 178*0e209d39SAndroid Build Coastguard Worker * @see NumberRangeFormatter 179*0e209d39SAndroid Build Coastguard Worker */ 180*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_RESULT_EQUAL_AFTER_ROUNDING, 181*0e209d39SAndroid Build Coastguard Worker 182*0e209d39SAndroid Build Coastguard Worker /** 183*0e209d39SAndroid Build Coastguard Worker * Used to indicate that the two numbers in the range were not equal, even after rounding rules were applied. 184*0e209d39SAndroid Build Coastguard Worker * 185*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 186*0e209d39SAndroid Build Coastguard Worker * @see NumberRangeFormatter 187*0e209d39SAndroid Build Coastguard Worker */ 188*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_RESULT_NOT_EQUAL, 189*0e209d39SAndroid Build Coastguard Worker 190*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API 191*0e209d39SAndroid Build Coastguard Worker /** 192*0e209d39SAndroid Build Coastguard Worker * The number of entries in this enum. 193*0e209d39SAndroid Build Coastguard Worker * @internal 194*0e209d39SAndroid Build Coastguard Worker */ 195*0e209d39SAndroid Build Coastguard Worker UNUM_IDENTITY_RESULT_COUNT 196*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_INTERNAL_API */ 197*0e209d39SAndroid Build Coastguard Worker 198*0e209d39SAndroid Build Coastguard Worker } UNumberRangeIdentityResult; 199*0e209d39SAndroid Build Coastguard Worker 200*0e209d39SAndroid Build Coastguard Worker 201*0e209d39SAndroid Build Coastguard Worker struct UNumberRangeFormatter; 202*0e209d39SAndroid Build Coastguard Worker /** 203*0e209d39SAndroid Build Coastguard Worker * C-compatible version of icu::number::LocalizedNumberRangeFormatter. 204*0e209d39SAndroid Build Coastguard Worker * 205*0e209d39SAndroid Build Coastguard Worker * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. 206*0e209d39SAndroid Build Coastguard Worker * 207*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 208*0e209d39SAndroid Build Coastguard Worker */ 209*0e209d39SAndroid Build Coastguard Worker typedef struct UNumberRangeFormatter UNumberRangeFormatter; 210*0e209d39SAndroid Build Coastguard Worker 211*0e209d39SAndroid Build Coastguard Worker 212*0e209d39SAndroid Build Coastguard Worker struct UFormattedNumberRange; 213*0e209d39SAndroid Build Coastguard Worker /** 214*0e209d39SAndroid Build Coastguard Worker * C-compatible version of icu::number::FormattedNumberRange. 215*0e209d39SAndroid Build Coastguard Worker * 216*0e209d39SAndroid Build Coastguard Worker * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. 217*0e209d39SAndroid Build Coastguard Worker * 218*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 219*0e209d39SAndroid Build Coastguard Worker */ 220*0e209d39SAndroid Build Coastguard Worker typedef struct UFormattedNumberRange UFormattedNumberRange; 221*0e209d39SAndroid Build Coastguard Worker 222*0e209d39SAndroid Build Coastguard Worker 223*0e209d39SAndroid Build Coastguard Worker /** 224*0e209d39SAndroid Build Coastguard Worker * Creates a new UNumberFormatter for the given skeleton string, collapse option, identity fallback 225*0e209d39SAndroid Build Coastguard Worker * option, and locale. This is currently the only method for creating a new UNumberRangeFormatter. 226*0e209d39SAndroid Build Coastguard Worker * 227*0e209d39SAndroid Build Coastguard Worker * Objects of type UNumberRangeFormatter returned by this method are threadsafe. 228*0e209d39SAndroid Build Coastguard Worker * 229*0e209d39SAndroid Build Coastguard Worker * For more details on skeleton strings, see the documentation in numberrangeformatter.h. For more 230*0e209d39SAndroid Build Coastguard Worker * details on the usage of this API, see the documentation at the top of unumberrangeformatter.h. 231*0e209d39SAndroid Build Coastguard Worker * 232*0e209d39SAndroid Build Coastguard Worker * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. 233*0e209d39SAndroid Build Coastguard Worker * 234*0e209d39SAndroid Build Coastguard Worker * @param skeleton The skeleton string, like u"percent precision-integer" 235*0e209d39SAndroid Build Coastguard Worker * @param skeletonLen The number of UChars in the skeleton string, or -1 if it is NUL-terminated. 236*0e209d39SAndroid Build Coastguard Worker * @param collapse Option for how to merge affixes (if unsure, use UNUM_RANGE_COLLAPSE_AUTO) 237*0e209d39SAndroid Build Coastguard Worker * @param identityFallback Option for resolving when both sides of the range are equal. 238*0e209d39SAndroid Build Coastguard Worker * @param locale The NUL-terminated locale ID. 239*0e209d39SAndroid Build Coastguard Worker * @param perror A parse error struct populated if an error occurs when parsing. Can be NULL. 240*0e209d39SAndroid Build Coastguard Worker * If no error occurs, perror->offset will be set to -1. 241*0e209d39SAndroid Build Coastguard Worker * @param ec Set if an error occurs. 242*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 243*0e209d39SAndroid Build Coastguard Worker */ 244*0e209d39SAndroid Build Coastguard Worker U_CAPI UNumberRangeFormatter* U_EXPORT2 245*0e209d39SAndroid Build Coastguard Worker unumrf_openForSkeletonWithCollapseAndIdentityFallback( 246*0e209d39SAndroid Build Coastguard Worker const UChar* skeleton, 247*0e209d39SAndroid Build Coastguard Worker int32_t skeletonLen, 248*0e209d39SAndroid Build Coastguard Worker UNumberRangeCollapse collapse, 249*0e209d39SAndroid Build Coastguard Worker UNumberRangeIdentityFallback identityFallback, 250*0e209d39SAndroid Build Coastguard Worker const char* locale, 251*0e209d39SAndroid Build Coastguard Worker UParseError* perror, 252*0e209d39SAndroid Build Coastguard Worker UErrorCode* ec); 253*0e209d39SAndroid Build Coastguard Worker 254*0e209d39SAndroid Build Coastguard Worker 255*0e209d39SAndroid Build Coastguard Worker /** 256*0e209d39SAndroid Build Coastguard Worker * Creates an object to hold the result of a UNumberRangeFormatter 257*0e209d39SAndroid Build Coastguard Worker * operation. The object can be used repeatedly; it is cleared whenever 258*0e209d39SAndroid Build Coastguard Worker * passed to a format function. 259*0e209d39SAndroid Build Coastguard Worker * 260*0e209d39SAndroid Build Coastguard Worker * @param ec Set if an error occurs. 261*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 262*0e209d39SAndroid Build Coastguard Worker */ 263*0e209d39SAndroid Build Coastguard Worker U_CAPI UFormattedNumberRange* U_EXPORT2 264*0e209d39SAndroid Build Coastguard Worker unumrf_openResult(UErrorCode* ec); 265*0e209d39SAndroid Build Coastguard Worker 266*0e209d39SAndroid Build Coastguard Worker 267*0e209d39SAndroid Build Coastguard Worker /** 268*0e209d39SAndroid Build Coastguard Worker * Uses a UNumberRangeFormatter to format a range of doubles. 269*0e209d39SAndroid Build Coastguard Worker * 270*0e209d39SAndroid Build Coastguard Worker * The UNumberRangeFormatter can be shared between threads. Each thread should have its own local 271*0e209d39SAndroid Build Coastguard Worker * UFormattedNumberRange, however, for storing the result of the formatting operation. 272*0e209d39SAndroid Build Coastguard Worker * 273*0e209d39SAndroid Build Coastguard Worker * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. 274*0e209d39SAndroid Build Coastguard Worker * 275*0e209d39SAndroid Build Coastguard Worker * @param uformatter A formatter object; see unumberrangeformatter.h. 276*0e209d39SAndroid Build Coastguard Worker * @param first The first (usually smaller) number in the range. 277*0e209d39SAndroid Build Coastguard Worker * @param second The second (usually larger) number in the range. 278*0e209d39SAndroid Build Coastguard Worker * @param uresult The object that will be mutated to store the result; see unumrf_openResult. 279*0e209d39SAndroid Build Coastguard Worker * @param ec Set if an error occurs. 280*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 281*0e209d39SAndroid Build Coastguard Worker */ 282*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2 283*0e209d39SAndroid Build Coastguard Worker unumrf_formatDoubleRange( 284*0e209d39SAndroid Build Coastguard Worker const UNumberRangeFormatter* uformatter, 285*0e209d39SAndroid Build Coastguard Worker double first, 286*0e209d39SAndroid Build Coastguard Worker double second, 287*0e209d39SAndroid Build Coastguard Worker UFormattedNumberRange* uresult, 288*0e209d39SAndroid Build Coastguard Worker UErrorCode* ec); 289*0e209d39SAndroid Build Coastguard Worker 290*0e209d39SAndroid Build Coastguard Worker 291*0e209d39SAndroid Build Coastguard Worker /** 292*0e209d39SAndroid Build Coastguard Worker * Uses a UNumberRangeFormatter to format a range of decimal numbers. 293*0e209d39SAndroid Build Coastguard Worker * 294*0e209d39SAndroid Build Coastguard Worker * With a decimal number string, you can specify an input with arbitrary precision. 295*0e209d39SAndroid Build Coastguard Worker * 296*0e209d39SAndroid Build Coastguard Worker * The UNumberRangeFormatter can be shared between threads. Each thread should have its own local 297*0e209d39SAndroid Build Coastguard Worker * UFormattedNumberRange, however, for storing the result of the formatting operation. 298*0e209d39SAndroid Build Coastguard Worker * 299*0e209d39SAndroid Build Coastguard Worker * NOTE: This is a C-compatible API; C++ users should build against numberrangeformatter.h instead. 300*0e209d39SAndroid Build Coastguard Worker * 301*0e209d39SAndroid Build Coastguard Worker * @param uformatter A formatter object; see unumberrangeformatter.h. 302*0e209d39SAndroid Build Coastguard Worker * @param first The first (usually smaller) number in the range. 303*0e209d39SAndroid Build Coastguard Worker * @param firstLen The length of the first decimal number string. 304*0e209d39SAndroid Build Coastguard Worker * @param second The second (usually larger) number in the range. 305*0e209d39SAndroid Build Coastguard Worker * @param secondLen The length of the second decimal number string. 306*0e209d39SAndroid Build Coastguard Worker * @param uresult The object that will be mutated to store the result; see unumrf_openResult. 307*0e209d39SAndroid Build Coastguard Worker * @param ec Set if an error occurs. 308*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 309*0e209d39SAndroid Build Coastguard Worker */ 310*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2 311*0e209d39SAndroid Build Coastguard Worker unumrf_formatDecimalRange( 312*0e209d39SAndroid Build Coastguard Worker const UNumberRangeFormatter* uformatter, 313*0e209d39SAndroid Build Coastguard Worker const char* first, 314*0e209d39SAndroid Build Coastguard Worker int32_t firstLen, 315*0e209d39SAndroid Build Coastguard Worker const char* second, 316*0e209d39SAndroid Build Coastguard Worker int32_t secondLen, 317*0e209d39SAndroid Build Coastguard Worker UFormattedNumberRange* uresult, 318*0e209d39SAndroid Build Coastguard Worker UErrorCode* ec); 319*0e209d39SAndroid Build Coastguard Worker 320*0e209d39SAndroid Build Coastguard Worker 321*0e209d39SAndroid Build Coastguard Worker /** 322*0e209d39SAndroid Build Coastguard Worker * Returns a representation of a UFormattedNumberRange as a UFormattedValue, 323*0e209d39SAndroid Build Coastguard Worker * which can be subsequently passed to any API requiring that type. 324*0e209d39SAndroid Build Coastguard Worker * 325*0e209d39SAndroid Build Coastguard Worker * The returned object is owned by the UFormattedNumberRange and is valid 326*0e209d39SAndroid Build Coastguard Worker * only as long as the UFormattedNumber is present and unchanged in memory. 327*0e209d39SAndroid Build Coastguard Worker * 328*0e209d39SAndroid Build Coastguard Worker * You can think of this method as a cast between types. 329*0e209d39SAndroid Build Coastguard Worker * 330*0e209d39SAndroid Build Coastguard Worker * @param uresult The object containing the formatted number range. 331*0e209d39SAndroid Build Coastguard Worker * @param ec Set if an error occurs. 332*0e209d39SAndroid Build Coastguard Worker * @return A UFormattedValue owned by the input object. 333*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 334*0e209d39SAndroid Build Coastguard Worker */ 335*0e209d39SAndroid Build Coastguard Worker U_CAPI const UFormattedValue* U_EXPORT2 336*0e209d39SAndroid Build Coastguard Worker unumrf_resultAsValue(const UFormattedNumberRange* uresult, UErrorCode* ec); 337*0e209d39SAndroid Build Coastguard Worker 338*0e209d39SAndroid Build Coastguard Worker 339*0e209d39SAndroid Build Coastguard Worker /** 340*0e209d39SAndroid Build Coastguard Worker * Extracts the identity result from a UFormattedNumberRange. 341*0e209d39SAndroid Build Coastguard Worker * 342*0e209d39SAndroid Build Coastguard Worker * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. 343*0e209d39SAndroid Build Coastguard Worker * 344*0e209d39SAndroid Build Coastguard Worker * @param uresult The object containing the formatted number range. 345*0e209d39SAndroid Build Coastguard Worker * @param ec Set if an error occurs. 346*0e209d39SAndroid Build Coastguard Worker * @return The identity result; see UNumberRangeIdentityResult. 347*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 348*0e209d39SAndroid Build Coastguard Worker */ 349*0e209d39SAndroid Build Coastguard Worker U_CAPI UNumberRangeIdentityResult U_EXPORT2 350*0e209d39SAndroid Build Coastguard Worker unumrf_resultGetIdentityResult( 351*0e209d39SAndroid Build Coastguard Worker const UFormattedNumberRange* uresult, 352*0e209d39SAndroid Build Coastguard Worker UErrorCode* ec); 353*0e209d39SAndroid Build Coastguard Worker 354*0e209d39SAndroid Build Coastguard Worker 355*0e209d39SAndroid Build Coastguard Worker /** 356*0e209d39SAndroid Build Coastguard Worker * Extracts the first formatted number as a decimal number. This endpoint 357*0e209d39SAndroid Build Coastguard Worker * is useful for obtaining the exact number being printed after scaling 358*0e209d39SAndroid Build Coastguard Worker * and rounding have been applied by the number range formatting pipeline. 359*0e209d39SAndroid Build Coastguard Worker * 360*0e209d39SAndroid Build Coastguard Worker * The syntax of the unformatted number is a "numeric string" 361*0e209d39SAndroid Build Coastguard Worker * as defined in the Decimal Arithmetic Specification, available at 362*0e209d39SAndroid Build Coastguard Worker * http://speleotrove.com/decimal 363*0e209d39SAndroid Build Coastguard Worker * 364*0e209d39SAndroid Build Coastguard Worker * @param uresult The input object containing the formatted number range. 365*0e209d39SAndroid Build Coastguard Worker * @param dest the 8-bit char buffer into which the decimal number is placed 366*0e209d39SAndroid Build Coastguard Worker * @param destCapacity The size, in chars, of the destination buffer. May be zero 367*0e209d39SAndroid Build Coastguard Worker * for precomputing the required size. 368*0e209d39SAndroid Build Coastguard Worker * @param ec receives any error status. 369*0e209d39SAndroid Build Coastguard Worker * If U_BUFFER_OVERFLOW_ERROR: Returns number of chars for 370*0e209d39SAndroid Build Coastguard Worker * preflighting. 371*0e209d39SAndroid Build Coastguard Worker * @return Number of chars in the data. Does not include a trailing NUL. 372*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 373*0e209d39SAndroid Build Coastguard Worker */ 374*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2 375*0e209d39SAndroid Build Coastguard Worker unumrf_resultGetFirstDecimalNumber( 376*0e209d39SAndroid Build Coastguard Worker const UFormattedNumberRange* uresult, 377*0e209d39SAndroid Build Coastguard Worker char* dest, 378*0e209d39SAndroid Build Coastguard Worker int32_t destCapacity, 379*0e209d39SAndroid Build Coastguard Worker UErrorCode* ec); 380*0e209d39SAndroid Build Coastguard Worker 381*0e209d39SAndroid Build Coastguard Worker 382*0e209d39SAndroid Build Coastguard Worker /** 383*0e209d39SAndroid Build Coastguard Worker * Extracts the second formatted number as a decimal number. This endpoint 384*0e209d39SAndroid Build Coastguard Worker * is useful for obtaining the exact number being printed after scaling 385*0e209d39SAndroid Build Coastguard Worker * and rounding have been applied by the number range formatting pipeline. 386*0e209d39SAndroid Build Coastguard Worker * 387*0e209d39SAndroid Build Coastguard Worker * The syntax of the unformatted number is a "numeric string" 388*0e209d39SAndroid Build Coastguard Worker * as defined in the Decimal Arithmetic Specification, available at 389*0e209d39SAndroid Build Coastguard Worker * http://speleotrove.com/decimal 390*0e209d39SAndroid Build Coastguard Worker * 391*0e209d39SAndroid Build Coastguard Worker * @param uresult The input object containing the formatted number range. 392*0e209d39SAndroid Build Coastguard Worker * @param dest the 8-bit char buffer into which the decimal number is placed 393*0e209d39SAndroid Build Coastguard Worker * @param destCapacity The size, in chars, of the destination buffer. May be zero 394*0e209d39SAndroid Build Coastguard Worker * for precomputing the required size. 395*0e209d39SAndroid Build Coastguard Worker * @param ec receives any error status. 396*0e209d39SAndroid Build Coastguard Worker * If U_BUFFER_OVERFLOW_ERROR: Returns number of chars for 397*0e209d39SAndroid Build Coastguard Worker * preflighting. 398*0e209d39SAndroid Build Coastguard Worker * @return Number of chars in the data. Does not include a trailing NUL. 399*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 400*0e209d39SAndroid Build Coastguard Worker */ 401*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2 402*0e209d39SAndroid Build Coastguard Worker unumrf_resultGetSecondDecimalNumber( 403*0e209d39SAndroid Build Coastguard Worker const UFormattedNumberRange* uresult, 404*0e209d39SAndroid Build Coastguard Worker char* dest, 405*0e209d39SAndroid Build Coastguard Worker int32_t destCapacity, 406*0e209d39SAndroid Build Coastguard Worker UErrorCode* ec); 407*0e209d39SAndroid Build Coastguard Worker 408*0e209d39SAndroid Build Coastguard Worker 409*0e209d39SAndroid Build Coastguard Worker /** 410*0e209d39SAndroid Build Coastguard Worker * Releases the UNumberFormatter created by unumf_openForSkeletonAndLocale(). 411*0e209d39SAndroid Build Coastguard Worker * 412*0e209d39SAndroid Build Coastguard Worker * @param uformatter An object created by unumf_openForSkeletonAndLocale(). 413*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 414*0e209d39SAndroid Build Coastguard Worker */ 415*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2 416*0e209d39SAndroid Build Coastguard Worker unumrf_close(UNumberRangeFormatter* uformatter); 417*0e209d39SAndroid Build Coastguard Worker 418*0e209d39SAndroid Build Coastguard Worker 419*0e209d39SAndroid Build Coastguard Worker /** 420*0e209d39SAndroid Build Coastguard Worker * Releases the UFormattedNumber created by unumf_openResult(). 421*0e209d39SAndroid Build Coastguard Worker * 422*0e209d39SAndroid Build Coastguard Worker * @param uresult An object created by unumf_openResult(). 423*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 424*0e209d39SAndroid Build Coastguard Worker */ 425*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2 426*0e209d39SAndroid Build Coastguard Worker unumrf_closeResult(UFormattedNumberRange* uresult); 427*0e209d39SAndroid Build Coastguard Worker 428*0e209d39SAndroid Build Coastguard Worker 429*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API 430*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 431*0e209d39SAndroid Build Coastguard Worker 432*0e209d39SAndroid Build Coastguard Worker /** 433*0e209d39SAndroid Build Coastguard Worker * \class LocalUNumberRangeFormatterPointer 434*0e209d39SAndroid Build Coastguard Worker * "Smart pointer" class; closes a UNumberFormatter via unumf_close(). 435*0e209d39SAndroid Build Coastguard Worker * For most methods see the LocalPointerBase base class. 436*0e209d39SAndroid Build Coastguard Worker * 437*0e209d39SAndroid Build Coastguard Worker * Usage: 438*0e209d39SAndroid Build Coastguard Worker * <pre> 439*0e209d39SAndroid Build Coastguard Worker * LocalUNumberRangeFormatterPointer uformatter( 440*0e209d39SAndroid Build Coastguard Worker * unumrf_openForSkeletonCollapseIdentityFallbackAndLocaleWithError(...)); 441*0e209d39SAndroid Build Coastguard Worker * // no need to explicitly call unumrf_close() 442*0e209d39SAndroid Build Coastguard Worker * </pre> 443*0e209d39SAndroid Build Coastguard Worker * 444*0e209d39SAndroid Build Coastguard Worker * @see LocalPointerBase 445*0e209d39SAndroid Build Coastguard Worker * @see LocalPointer 446*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 447*0e209d39SAndroid Build Coastguard Worker */ 448*0e209d39SAndroid Build Coastguard Worker U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberRangeFormatterPointer, UNumberRangeFormatter, unumrf_close); 449*0e209d39SAndroid Build Coastguard Worker 450*0e209d39SAndroid Build Coastguard Worker /** 451*0e209d39SAndroid Build Coastguard Worker * \class LocalUFormattedNumberPointer 452*0e209d39SAndroid Build Coastguard Worker * "Smart pointer" class; closes a UFormattedNumber via unumf_closeResult(). 453*0e209d39SAndroid Build Coastguard Worker * For most methods see the LocalPointerBase base class. 454*0e209d39SAndroid Build Coastguard Worker * 455*0e209d39SAndroid Build Coastguard Worker * Usage: 456*0e209d39SAndroid Build Coastguard Worker * <pre> 457*0e209d39SAndroid Build Coastguard Worker * LocalUFormattedNumberRangePointer uresult(unumrf_openResult(...)); 458*0e209d39SAndroid Build Coastguard Worker * // no need to explicitly call unumrf_closeResult() 459*0e209d39SAndroid Build Coastguard Worker * </pre> 460*0e209d39SAndroid Build Coastguard Worker * 461*0e209d39SAndroid Build Coastguard Worker * @see LocalPointerBase 462*0e209d39SAndroid Build Coastguard Worker * @see LocalPointer 463*0e209d39SAndroid Build Coastguard Worker * @stable ICU 68 464*0e209d39SAndroid Build Coastguard Worker */ 465*0e209d39SAndroid Build Coastguard Worker U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedNumberRangePointer, UFormattedNumberRange, unumrf_closeResult); 466*0e209d39SAndroid Build Coastguard Worker 467*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 468*0e209d39SAndroid Build Coastguard Worker #endif // U_SHOW_CPLUSPLUS_API 469*0e209d39SAndroid Build Coastguard Worker 470*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 471*0e209d39SAndroid Build Coastguard Worker #endif //__UNUMBERRANGEFORMATTER_H__ 472