// © 2022 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html #ifndef __USIMPLENUMBERFORMATTER_H__ #define __USIMPLENUMBERFORMATTER_H__ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING #include "unicode/uformattednumber.h" #include "unicode/unumberoptions.h" /** * \file * \brief C API: Simple number formatting focused on low memory and code size. * * These functions render locale-aware number strings but without the bells and whistles found in * other number formatting APIs such as those in unumberformatter.h, like units and currencies. * * Example using C++ helpers: * *
 * LocalUSimpleNumberFormatterPointer uformatter(usnumf_openForLocale("de-CH", status));
 * LocalUFormattedNumberPointer uresult(unumf_openResult(status));
 * usnumf_formatInt64(uformatter.getAlias(), 55, uresult.getAlias(), status);
 * assertEquals("",
 *     u"55",
 *     ufmtval_getString(unumf_resultAsValue(uresult.getAlias(), status), nullptr, status));
 * 
* * Example using pure C: * *
 * UErrorCode ec = U_ZERO_ERROR;
 * USimpleNumberFormatter* uformatter = usnumf_openForLocale("bn", &ec);
 * USimpleNumber* unumber = usnum_openForInt64(1000007, &ec);
 * UFormattedNumber* uresult = unumf_openResult(&ec);
 * usnumf_format(uformatter, unumber, uresult, &ec);
 * int32_t len;
 * const UChar* str = ufmtval_getString(unumf_resultAsValue(uresult, &ec), &len, &ec);
 * if (assertSuccess("Formatting end-to-end", &ec)) {
 *     assertUEquals("Should produce a result in Bangla digits", u"১০,০০,০০৭", str);
 * }

 * // Cleanup:
 * unumf_closeResult(uresult);
 * usnum_close(unumber);
 * usnumf_close(uformatter);
 * 
*/ #ifndef U_HIDE_DRAFT_API /** * An explicit sign option for a SimpleNumber. * * @draft ICU 73 */ typedef enum USimpleNumberSign { /** * Render a plus sign. * * @draft ICU 73 */ UNUM_SIMPLE_NUMBER_PLUS_SIGN, /** * Render no sign. * * @draft ICU 73 */ UNUM_SIMPLE_NUMBER_NO_SIGN, /** * Render a minus sign. * * @draft ICU 73 */ UNUM_SIMPLE_NUMBER_MINUS_SIGN, } USimpleNumberSign; struct USimpleNumber; /** * C-compatible version of icu::number::SimpleNumber. * * @draft ICU 73 */ typedef struct USimpleNumber USimpleNumber; struct USimpleNumberFormatter; /** * C-compatible version of icu::number::SimpleNumberFormatter. * * @draft ICU 73 */ typedef struct USimpleNumberFormatter USimpleNumberFormatter; /** * Creates a new USimpleNumber to be formatted with a USimpleNumberFormatter. * * @draft ICU 73 */ U_CAPI USimpleNumber* U_EXPORT2 usnum_openForInt64(int64_t value, UErrorCode* ec); /** * Overwrites the value in a USimpleNumber to an int64_t. * * This can be used to reset the number value after formatting. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_setToInt64(USimpleNumber* unumber, int64_t value, UErrorCode* ec); /** * Changes the value of the USimpleNumber by a power of 10. * * This function immediately mutates the inner value. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_multiplyByPowerOfTen(USimpleNumber* unumber, int32_t power, UErrorCode* ec); /** * Rounds the value currently stored in the USimpleNumber to the given power of 10. * * This function immediately mutates the inner value. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_roundTo(USimpleNumber* unumber, int32_t power, UNumberFormatRoundingMode roundingMode, UErrorCode* ec); /** * Pads the beginning of the number with zeros up to the given minimum number of integer digits. * * This setting is applied upon formatting the number. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_setMinimumIntegerDigits(USimpleNumber* unumber, int32_t minimumIntegerDigits, UErrorCode* ec); /** * Pads the end of the number with zeros up to the given minimum number of fraction digits. * * This setting is applied upon formatting the number. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_setMinimumFractionDigits(USimpleNumber* unumber, int32_t minimumFractionDigits, UErrorCode* ec); /** * Truncates digits from the beginning of the number to the given maximum number of integer digits. * * This function immediately mutates the inner value. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_truncateStart(USimpleNumber* unumber, int32_t maximumIntegerDigits, UErrorCode* ec); /** * Sets the sign of the number: an explicit plus sign, explicit minus sign, or no sign. * * This setting is applied upon formatting the number. * * NOTE: This does not support accounting sign notation. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_setSign(USimpleNumber* unumber, USimpleNumberSign sign, UErrorCode* ec); /** * Creates a new USimpleNumberFormatter with all locale defaults. * * @draft ICU 73 */ U_CAPI USimpleNumberFormatter* U_EXPORT2 usnumf_openForLocale(const char* locale, UErrorCode* ec); /** * Creates a new USimpleNumberFormatter, overriding the grouping strategy. * * @draft ICU 73 */ U_CAPI USimpleNumberFormatter* U_EXPORT2 usnumf_openForLocaleAndGroupingStrategy( const char* locale, UNumberGroupingStrategy groupingStrategy, UErrorCode* ec); /** * Formats a number using this SimpleNumberFormatter. * * The USimpleNumber is cleared after calling this function. It can be re-used via * usnum_setToInt64. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnumf_format( const USimpleNumberFormatter* uformatter, USimpleNumber* unumber, UFormattedNumber* uresult, UErrorCode* ec); /** * Formats an integer using this SimpleNumberFormatter. * * For more control over the formatting, use USimpleNumber. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnumf_formatInt64( const USimpleNumberFormatter* uformatter, int64_t value, UFormattedNumber* uresult, UErrorCode* ec); /** * Frees the memory held by a USimpleNumber. * * NOTE: Normally, a USimpleNumber should be adopted by usnumf_formatAndAdoptNumber. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnum_close(USimpleNumber* unumber); /** * Frees the memory held by a USimpleNumberFormatter. * * @draft ICU 73 */ U_CAPI void U_EXPORT2 usnumf_close(USimpleNumberFormatter* uformatter); #if U_SHOW_CPLUSPLUS_API U_NAMESPACE_BEGIN /** * \class LocalUSimpleNumberPointer * "Smart pointer" class; closes a USimpleNumber via usnum_close(). * For most methods see the LocalPointerBase base class. * * NOTE: Normally, a USimpleNumber should be adopted by usnumf_formatAndAdoptNumber. * If you use LocalUSimpleNumberPointer, call `.orphan()` when passing to that function. * * Usage: *
 * LocalUSimpleNumberPointer uformatter(usnumf_openForInteger(...));
 * // no need to explicitly call usnum_close()
 * 
* * @see LocalPointerBase * @see LocalPointer * @draft ICU 73 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberPointer, USimpleNumber, usnum_close); /** * \class LocalUSimpleNumberFormatterPointer * "Smart pointer" class; closes a USimpleNumberFormatter via usnumf_close(). * For most methods see the LocalPointerBase base class. * * Usage: *
 * LocalUSimpleNumberFormatterPointer uformatter(usnumf_openForLocale(...));
 * // no need to explicitly call usnumf_close()
 * 
* * @see LocalPointerBase * @see LocalPointer * @draft ICU 73 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberFormatterPointer, USimpleNumberFormatter, usnumf_close); U_NAMESPACE_END #endif // U_SHOW_CPLUSPLUS_API #endif // U_HIDE_DRAFT_API #endif /* #if !UCONFIG_NO_FORMATTING */ #endif //__USIMPLENUMBERFORMATTER_H__