aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/icu/include/unicode/usimplenumberformatter.h
blob: 22e81ba2c939b08ef1d5414f76772aa4dc2af1fc (plain) (blame)
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
// © 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:
 *
 * <pre>
 * 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));
 * </pre>
 *
 * Example using pure C:
 * 
 * <pre>
 * 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);
 * </pre>
 */

/**
 * An explicit sign option for a SimpleNumber.
 *
 * @stable ICU 73
 */
typedef enum USimpleNumberSign {
    /**
     * Render a plus sign.
     *
     * @stable ICU 73
     */
    UNUM_SIMPLE_NUMBER_PLUS_SIGN,
    /**
     * Render no sign.
     *
     * @stable ICU 73
     */
    UNUM_SIMPLE_NUMBER_NO_SIGN,
    /**
     * Render a minus sign.
     *
     * @stable ICU 73
     */
    UNUM_SIMPLE_NUMBER_MINUS_SIGN,
} USimpleNumberSign;


struct USimpleNumber;
/**
 * C-compatible version of icu::number::SimpleNumber.
 *
 * @stable ICU 73
 */
typedef struct USimpleNumber USimpleNumber;


struct USimpleNumberFormatter;
/**
 * C-compatible version of icu::number::SimpleNumberFormatter.
 *
 * @stable ICU 73
 */
typedef struct USimpleNumberFormatter USimpleNumberFormatter;


/**
 * Creates a new USimpleNumber to be formatted with a USimpleNumberFormatter.
 *
 * @stable 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.
 *
 * @stable 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.
 *
 * @stable 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,
 * which can be before or after the decimal separator.
 *
 * This function does not change minimum integer digits.
 *
 * @stable 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.
 *
 * @stable 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.
 *
 * @stable ICU 73
 */
U_CAPI void U_EXPORT2
usnum_setMinimumFractionDigits(USimpleNumber* unumber, int32_t minimumFractionDigits, UErrorCode* ec);


#ifndef U_HIDE_DRAFT_API
/**
 * Sets the number of integer digits to the given amount, truncating if necessary.
 *
 * @draft ICU 75
 */
U_CAPI void U_EXPORT2
usnum_setMaximumIntegerDigits(USimpleNumber* unumber, int32_t maximumIntegerDigits, UErrorCode* ec);
#endif // U_HIDE_DRAFT_API


/**
 * 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.
 *
 * @stable ICU 73
 */
U_CAPI void U_EXPORT2
usnum_setSign(USimpleNumber* unumber, USimpleNumberSign sign, UErrorCode* ec);


/**
 * Creates a new USimpleNumberFormatter with all locale defaults.
 *
 * @stable ICU 73
 */
U_CAPI USimpleNumberFormatter* U_EXPORT2
usnumf_openForLocale(const char* locale, UErrorCode* ec);


/**
 * Creates a new USimpleNumberFormatter, overriding the grouping strategy.
 *
 * @stable 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.
 *
 * @stable 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.
 *
 * @stable 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.
 *
 * @stable ICU 73
 */
U_CAPI void U_EXPORT2
usnum_close(USimpleNumber* unumber);


/**
 * Frees the memory held by a USimpleNumberFormatter.
 *
 * @stable 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:
 * <pre>
 * LocalUSimpleNumberPointer uformatter(usnumf_openForInteger(...));
 * // no need to explicitly call usnum_close()
 * </pre>
 *
 * @see LocalPointerBase
 * @see LocalPointer
 * @stable 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:
 * <pre>
 * LocalUSimpleNumberFormatterPointer uformatter(usnumf_openForLocale(...));
 * // no need to explicitly call usnumf_close()
 * </pre>
 *
 * @see LocalPointerBase
 * @see LocalPointer
 * @stable ICU 73
 */
U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberFormatterPointer, USimpleNumberFormatter, usnumf_close);

U_NAMESPACE_END
#endif // U_SHOW_CPLUSPLUS_API

#endif /* #if !UCONFIG_NO_FORMATTING */
#endif //__USIMPLENUMBERFORMATTER_H__