@ryuzaki13/react-foundation-lib 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +20 -16
  2. package/dist/table/index.d.ts +1 -0
  3. package/dist/table/index.d.ts.map +1 -1
  4. package/dist/table/index.js +77 -64
  5. package/dist/table/index.js.map +1 -1
  6. package/dist/table/tanStackFeatures.d.ts +19 -0
  7. package/dist/table/tanStackFeatures.d.ts.map +1 -0
  8. package/dist/table/types.d.ts +17 -2
  9. package/dist/table/types.d.ts.map +1 -1
  10. package/package.json +9 -9
  11. package/src/array/README.mdx +1630 -0
  12. package/src/binary/README.mdx +1405 -0
  13. package/src/copy/README.mdx +992 -0
  14. package/src/crypto/README.mdx +1052 -0
  15. package/src/dom/README.mdx +2179 -0
  16. package/src/file/README.mdx +1957 -0
  17. package/src/formatters/README.mdx +469 -0
  18. package/src/formatters/boolean/README.mdx +494 -0
  19. package/src/formatters/date/README.mdx +732 -0
  20. package/src/formatters/number/README.mdx +542 -0
  21. package/src/formatters/pipeline/README.mdx +629 -0
  22. package/src/formatters/rowBased/README.mdx +486 -0
  23. package/src/formatters/strings/README.mdx +442 -0
  24. package/src/formatters/valueState/README.mdx +459 -0
  25. package/src/formulas/README.mdx +1283 -0
  26. package/src/binary/README.md +0 -110
  27. package/src/docs/browserAndReact.mdx +0 -150
  28. package/src/docs/filesAndExcel.mdx +0 -163
  29. package/src/docs/formatters-runtime.mdx +0 -455
  30. package/src/docs/formatters.mdx +0 -380
  31. package/src/docs/odataAndTables.mdx +0 -178
  32. package/src/docs/pureUtilities.mdx +0 -96
  33. package/src/docs/runtimeAndState.mdx +0 -155
  34. package/src/file/README.md +0 -289
  35. package/src/formatters/date/README.md +0 -520
  36. package/src/formatters/number/README.md +0 -123
  37. package/src/formatters/valueState/README.md +0 -275
  38. package/src/formulas/README.md +0 -42
@@ -0,0 +1,542 @@
1
+ import { Meta } from "@storybook/addon-docs/blocks";
2
+
3
+ <Meta title="Foundation Lib/API/Formatters/Number" />
4
+
5
+ # Числовые форматтеры
6
+
7
+ Модуль форматирует числа для интерфейса, читает распространённые SAP-подобные числовые строки и управляет реестром именованных presets.
8
+
9
+ Все API доступны через один публичный entrypoint:
10
+
11
+ ```ts
12
+ import {
13
+ formatNumber,
14
+ formatNumberAsDecimal2,
15
+ formatNumberAsInteger,
16
+ isZeroValue,
17
+ parseNumber,
18
+ toFiniteNumber
19
+ } from "@ryuzaki13/react-foundation-lib/formatters";
20
+ ```
21
+
22
+ Импорта `@ryuzaki13/react-foundation-lib/formatters/number` нет.
23
+
24
+ ## Быстрый старт
25
+
26
+ ```ts
27
+ import {
28
+ formatNumberAsDecimal2,
29
+ formatNumberAsInteger,
30
+ formatNumberAsPercent,
31
+ toFiniteNumber
32
+ } from "@ryuzaki13/react-foundation-lib/formatters";
33
+
34
+ formatNumberAsInteger(1234.6); // "1 235"
35
+ formatNumberAsDecimal2(1234.5); // "1 234,50"
36
+ formatNumberAsPercent(12.345); // "12,35"
37
+
38
+ toFiniteNumber("1 234,50"); // 1234.5
39
+ ```
40
+
41
+ Пробел между группами в результате обычно неразрывный (`U+00A0` или `U+202F` в зависимости от JavaScript-среды). Внешне он выглядит как обычный пробел.
42
+
43
+ ## Два разных пути обработки
44
+
45
+ В модуле есть важное разделение:
46
+
47
+ ```text
48
+ внешняя строка SAP/UI ──→ toFiniteNumber / parseNumber ──→ number
49
+ готовое JS-значение ────→ formatNumber ──────────────────→ string для UI
50
+ ```
51
+
52
+ `formatNumber` не вызывает SAP-like parser. Она использует обычный `Number(value)`. Поэтому:
53
+
54
+ ```ts
55
+ formatNumber("1234.5", "decimal-2"); // "1 234,50"
56
+ formatNumber("1 234,5", "decimal-2"); // "0"
57
+ ```
58
+
59
+ Если строка пришла от пользователя или SAP и содержит разделители, сначала парсите её:
60
+
61
+ ```ts
62
+ const value = toFiniteNumber("1 234,5");
63
+ const text = value === undefined ? "Некорректно" : formatNumber(value, "decimal-2");
64
+ ```
65
+
66
+ ## Встроенные presets
67
+
68
+ | Имя | Дробных знаков | Назначение |
69
+ | ------------------------ | -------------: | ---------------------------------------------------------- |
70
+ | `integer` | 0 | Целое число |
71
+ | `decimal` | 1 | Обычное дробное число |
72
+ | `decimal-2` | 2 | Два знака после запятой |
73
+ | `decimal-3` | 3 | Три знака после запятой |
74
+ | `currency` | 0 | Денежное число без символа валюты |
75
+ | `price` | 0 | Цена без символа валюты |
76
+ | `percent` | 2 | Процентное число без автоматического умножения и знака `%` |
77
+ | `tonnage` | 1 | Тоннаж |
78
+ | `compact-currency` | 0 | Компактное число, усечение |
79
+ | `compact-currency-round` | 0 | Компактное число, округление |
80
+ | `compact-percent` | до 2 | Компактный процент, усечение |
81
+ | `compact-percent-round` | до 2 | Компактный процент, округление |
82
+ | `compact-tonnage` | до 1 | Компактный тоннаж, усечение |
83
+ | `compact-tonnage-round` | до 1 | Компактный тоннаж, округление |
84
+
85
+ Имена регистрозависимы и записываются в нижнем регистре:
86
+
87
+ ```ts
88
+ formatNumber(10, "integer"); // корректно
89
+ // formatNumber(10, "Integer"); // Error: preset не найден
90
+ ```
91
+
92
+ Константа `DEFAULT_NUMBER_PRESET_NAMES` позволяет не дублировать строки:
93
+
94
+ ```ts
95
+ import { DEFAULT_NUMBER_PRESET_NAMES, formatNumber } from "@ryuzaki13/react-foundation-lib/formatters";
96
+
97
+ formatNumber(1234.5, DEFAULT_NUMBER_PRESET_NAMES.decimal2);
98
+ ```
99
+
100
+ ## `formatNumber(value, presetOrName)`
101
+
102
+ ```ts
103
+ function formatNumber(value: unknown, presetOrName: string | NumberFormatPreset): string;
104
+ ```
105
+
106
+ Функция:
107
+
108
+ 1. отдельно превращает пустую/пробельную строку в `"0"`;
109
+ 2. вызывает `Number(value)`;
110
+ 3. для `NaN` и бесконечности возвращает `"0"`;
111
+ 4. находит preset по имени или использует переданный объект;
112
+ 5. округляет и форматирует число;
113
+ 6. применяет compact-семантику, если она задана.
114
+
115
+ ```ts
116
+ formatNumber(1234.56, "decimal-2"); // "1 234,56"
117
+ formatNumber(1234.56, "integer"); // "1 235"
118
+ formatNumber("", "decimal"); // "0"
119
+ formatNumber("abc", "decimal"); // "0"
120
+ ```
121
+
122
+ ### Неожиданная JavaScript-семантика `Number`
123
+
124
+ Поскольку вход имеет тип `unknown`, обычное преобразование JavaScript допускает случаи:
125
+
126
+ ```ts
127
+ formatNumber(null, "integer"); // "0"
128
+ formatNumber(false, "integer"); // "0"
129
+ formatNumber(true, "integer"); // "1"
130
+ formatNumber([], "integer"); // "0"
131
+ ```
132
+
133
+ Не используйте эти преобразования как бизнес-валидацию. Проверяйте внешние данные до форматирования.
134
+
135
+ Если значение не преобразовалось в конечное число, функция возвращает `"0"` ещё до поиска preset. Поэтому неизвестный preset для невалидного значения может не выбросить ошибку:
136
+
137
+ ```ts
138
+ formatNumber("abc", "unknown"); // "0"
139
+ formatNumber(10, "unknown"); // Error
140
+ ```
141
+
142
+ ### Округление
143
+
144
+ Обычные presets используют `Intl.NumberFormat`, то есть округляют до заданного количества знаков:
145
+
146
+ ```ts
147
+ formatNumber(1.26, "decimal"); // "1,3"
148
+ ```
149
+
150
+ Старое предположение об усечении для обычных presets неверно. Усечение используется по умолчанию только внутри compact-настроек.
151
+
152
+ ## Готовые wrappers
153
+
154
+ | Функция | Preset |
155
+ | ------------------------ | ----------- |
156
+ | `formatNumberAsInteger` | `integer` |
157
+ | `formatNumberAsCurrency` | `currency` |
158
+ | `formatNumberAsDecimal` | `decimal` |
159
+ | `formatNumberAsDecimal2` | `decimal-2` |
160
+ | `formatNumberAsDecimal3` | `decimal-3` |
161
+ | `formatNumberAsPercent` | `percent` |
162
+ | `formatNumberAsPrice` | `price` |
163
+ | `formatNumberAsTonnage` | `tonnage` |
164
+
165
+ ```ts
166
+ formatNumberAsDecimal(12); // "12,0"
167
+ formatNumberAsDecimal2(12); // "12,00"
168
+ formatNumberAsDecimal3(12); // "12,000"
169
+ ```
170
+
171
+ `currency`, `price` и `percent` не добавляют обозначение единицы. Они задают только числовой вид:
172
+
173
+ ```ts
174
+ formatNumberAsCurrency(1250); // "1 250", без ₽
175
+ formatNumberAsPercent(12.5); // "12,50", без %
176
+ ```
177
+
178
+ Если нужен суффикс, добавляйте его на UI-уровне или используйте специализированный модуль единиц измерения.
179
+
180
+ ## Wrappers `OrEmpty`
181
+
182
+ Для каждого wrapper существует вариант, который скрывает семантический ноль:
183
+
184
+ - `formatNumberAsIntegerOrEmpty`;
185
+ - `formatNumberAsCurrencyOrEmpty`;
186
+ - `formatNumberAsDecimalOrEmpty`;
187
+ - `formatNumberAsDecimal2OrEmpty`;
188
+ - `formatNumberAsDecimal3OrEmpty`;
189
+ - `formatNumberAsPercentOrEmpty`;
190
+ - `formatNumberAsPriceOrEmpty`;
191
+ - `formatNumberAsTonnageOrEmpty`.
192
+
193
+ ```ts
194
+ formatNumberAsDecimalOrEmpty(0); // ""
195
+ formatNumberAsDecimalOrEmpty("0,00"); // ""
196
+ formatNumberAsDecimalOrEmpty(" "); // "0"
197
+ formatNumberAsDecimalOrEmpty("abc"); // "0"
198
+ ```
199
+
200
+ Последние два результата объясняются тем, что `isZeroValue` не считает пустой или невалидный ввод числовым нулём, после чего обычный formatter даёт свой fallback `"0"`.
201
+
202
+ ## Compact-форматирование
203
+
204
+ Compact presets сокращают большие значения:
205
+
206
+ - `тыс` — тысячи;
207
+ - `млн` — миллионы;
208
+ - `млрд` — миллиарды;
209
+ - `трлн` — триллионы.
210
+
211
+ По умолчанию compact включается при абсолютном значении от `1000`. Знак отрицательного числа сохраняется.
212
+
213
+ ```ts
214
+ formatNumber(1_500, "compact-tonnage"); // компактное представление с "тыс"
215
+ formatNumber(2_000_000, "compact-currency"); // представление с "млн"
216
+ ```
217
+
218
+ Если `maxDecimals` не задан, нормализованные значения меньше `10` получают до одного дробного знака, а значения от `10` — целое представление.
219
+
220
+ ### Усечение и округление
221
+
222
+ Presets без `-round` используют `roundingMode: "trunc"`. Парные presets с `-round` используют математическое `round`.
223
+
224
+ Для положительного числа усечение просто отбрасывает остаток; для отрицательного оно движется к нулю. Это отличается от `floor`, который движется к минус бесконечности.
225
+
226
+ ### Собственные compact units
227
+
228
+ ```ts
229
+ import type { NumberFormatPreset } from "@ryuzaki13/react-foundation-lib/formatters";
230
+
231
+ const preset: NumberFormatPreset = {
232
+ name: "custom-compact",
233
+ decimals: 1,
234
+ decimalSeparator: ",",
235
+ grouping: true,
236
+ groupingSeparator: " ",
237
+ groupingSize: 3,
238
+ compact: {
239
+ minCompactValue: 10_000,
240
+ maxDecimals: 1,
241
+ roundingMode: "round",
242
+ suffixSeparator: " ",
243
+ units: [
244
+ { value: 1_000_000, suffix: "M" },
245
+ { value: 1_000, suffix: "K" }
246
+ ]
247
+ }
248
+ };
249
+
250
+ formatNumber(1_250_000, preset); // "1,3 M"
251
+ ```
252
+
253
+ Располагайте units от большей к меньшей: выбирается первая единица, чей `value` не превышает абсолютное число.
254
+
255
+ ## Чтение числовых строк
256
+
257
+ ### `toFiniteNumber(value)`
258
+
259
+ ```ts
260
+ function toFiniteNumber(value: unknown): number | undefined;
261
+ ```
262
+
263
+ Возвращает только конечное число или `undefined`.
264
+
265
+ Поддерживаются:
266
+
267
+ - готовый `number`;
268
+ - стандартная числовая строка JavaScript;
269
+ - пробел, NBSP, narrow NBSP и апостроф как разделители групп;
270
+ - запятая как десятичный разделитель, если в строке нет точки;
271
+ - формат `1,234.56`, где запятые считаются группировкой.
272
+
273
+ ```ts
274
+ toFiniteNumber(12.5); // 12.5
275
+ toFiniteNumber(" 12.5 "); // 12.5
276
+ toFiniteNumber("1 234,56"); // 1234.56
277
+ toFiniteNumber("1\u00a0234,56"); // 1234.56
278
+ toFiniteNumber("1'234,56"); // 1234.56
279
+ toFiniteNumber("1,234.56"); // 1234.56
280
+ toFiniteNumber(""); // undefined
281
+ toFiniteNumber("abc"); // undefined
282
+ toFiniteNumber(Infinity); // undefined
283
+ toFiniteNumber(null); // undefined
284
+ ```
285
+
286
+ Стандартный `Number(trimmed)` выполняется первым, поэтому поддерживаются и его синтаксисы, включая exponent и шестнадцатеричную строку:
287
+
288
+ ```ts
289
+ toFiniteNumber("1e3"); // 1000
290
+ toFiniteNumber("0x10"); // 16
291
+ ```
292
+
293
+ ### Важное ограничение двух разделителей
294
+
295
+ Если присутствуют и запятая, и точка, все запятые считаются группировкой:
296
+
297
+ ```ts
298
+ toFiniteNumber("1,234.56"); // 1234.56
299
+ toFiniteNumber("1.234,56"); // 1.23456, не 1234.56
300
+ ```
301
+
302
+ То есть европейская запись с точкой-группировкой и запятой-дробью не поддерживается. Нормализуйте такой источник по его явной locale-схеме до вызова.
303
+
304
+ ### `parseNumber(value)`
305
+
306
+ ```ts
307
+ function parseNumber(value: unknown): number;
308
+ ```
309
+
310
+ Это `toFiniteNumber(value) ?? 0`:
311
+
312
+ ```ts
313
+ parseNumber("1 234,5"); // 1234.5
314
+ parseNumber("abc"); // 0
315
+ parseNumber(undefined); // 0
316
+ ```
317
+
318
+ Используйте её для арифметики, где невалидный вход действительно должен считаться нулём. Если отсутствие данных важно отличать от нуля, используйте `toFiniteNumber`.
319
+
320
+ ### `isPositiveValue(value)`
321
+
322
+ Возвращает `true`, только если значение успешно разобрано и строго больше нуля:
323
+
324
+ ```ts
325
+ isPositiveValue("0,1"); // true
326
+ isPositiveValue(0); // false
327
+ isPositiveValue(-1); // false
328
+ isPositiveValue("abc"); // false
329
+ ```
330
+
331
+ ### `toPositiveInteger(value)`
332
+
333
+ Возвращает положительное целое число либо `undefined`:
334
+
335
+ ```ts
336
+ toPositiveInteger("12"); // 12
337
+ toPositiveInteger("12,5"); // undefined
338
+ toPositiveInteger(0); // undefined
339
+ toPositiveInteger(-2); // undefined
340
+ ```
341
+
342
+ ### `isZeroValue(value)`
343
+
344
+ Возвращает `true`, если `toFiniteNumber` успешно получил ровно `0`:
345
+
346
+ ```ts
347
+ isZeroValue(0); // true
348
+ isZeroValue(-0); // true
349
+ isZeroValue("0,00"); // true
350
+ isZeroValue(" 0 "); // true
351
+ isZeroValue(""); // false
352
+ isZeroValue(null); // false
353
+ isZeroValue("abc"); // false
354
+ ```
355
+
356
+ BigInt фактически не проходит через `toFiniteNumber`, поэтому `0n` также возвращает `false` в текущем публичном поведении.
357
+
358
+ ## Реестр presets
359
+
360
+ ### `getNumberPreset(name)`
361
+
362
+ Возвращает preset или `undefined`:
363
+
364
+ ```ts
365
+ const preset = getNumberPreset("decimal-2");
366
+ ```
367
+
368
+ Возвращается сам объект из глобального реестра, а не clone. Не мутируйте его.
369
+
370
+ ### `getNumberPresetNames()`
371
+
372
+ Возвращает новый массив имён в порядке регистрации. Подходит для UI выбора preset.
373
+
374
+ ### `registerNumberPreset(config)`
375
+
376
+ Регистрирует или перезаписывает preset. Все отсутствующие поля поверхностно берутся из `NUMBER_FORMAT_DEFAULTS`:
377
+
378
+ ```ts
379
+ registerNumberPreset({
380
+ name: "accounting-2",
381
+ decimals: 2,
382
+ groupingSeparator: " ",
383
+ decimalSeparator: ","
384
+ });
385
+
386
+ formatNumber(1234.5, "accounting-2"); // "1 234,50"
387
+ ```
388
+
389
+ Регистрация глобальна для текущего экземпляра модуля. Выполняйте её один раз при старте приложения до компиляции formatter pipeline.
390
+
391
+ Имя не trim-ится и поля не валидируются. Передавайте непустое устойчивое имя, не меняйте встроенные presets без явной необходимости и проверяйте числовые параметры.
392
+
393
+ ### `resetNumberPresets()`
394
+
395
+ Очищает реестр и восстанавливает только встроенные presets. Основной сценарий — изоляция тестов. Пользовательские presets после сброса исчезают.
396
+
397
+ ### `NUMBER_FORMAT_DEFAULTS`
398
+
399
+ ```ts
400
+ {
401
+ decimals: 1,
402
+ decimalSeparator: ",",
403
+ grouping: true,
404
+ groupingSeparator: /* ru-RU group char */,
405
+ groupingSize: 3
406
+ }
407
+ ```
408
+
409
+ Объект экспортируется, но не заморожен. Относитесь к нему как к read-only константе: мутация изменит будущие регистрации и сделает поведение глобально непредсказуемым.
410
+
411
+ ## Объектный preset без регистрации
412
+
413
+ `formatNumber` принимает готовый `NumberFormatPreset`:
414
+
415
+ ```ts
416
+ formatNumber(1234567.89, {
417
+ name: "inline",
418
+ decimals: 2,
419
+ decimalSeparator: ".",
420
+ grouping: true,
421
+ groupingSeparator: "_",
422
+ groupingSize: 3
423
+ });
424
+ // "1_234_567.89"
425
+ ```
426
+
427
+ Такой объект не попадает в реестр. Он полезен для локального стабильного правила; переиспользуемый формат лучше зарегистрировать централизованно.
428
+
429
+ Параметры не валидируются. Используйте:
430
+
431
+ - `decimals` — целое неотрицательное число в диапазоне, допустимом `Intl.NumberFormat`;
432
+ - `groupingSize` — положительное целое число;
433
+ - конечные положительные `unit.value`;
434
+ - известный `roundingMode`.
435
+
436
+ Нулевой или отрицательный `groupingSize` в ручной ветке группировки может привести к незавершающемуся циклу. Не передавайте непроверенный пользовательский объект напрямую.
437
+
438
+ ## `truncateNumber(num, decimals)`
439
+
440
+ Низкоуровневая математическая функция усекает дробную часть без округления:
441
+
442
+ ```ts
443
+ truncateNumber(123.789, 1); // 123.7
444
+ truncateNumber(-123.789, 1); // -123.7
445
+ truncateNumber(123.789, 0); // 123
446
+ truncateNumber(123.789, -1); // 120
447
+ ```
448
+
449
+ Функция не валидирует параметры и не используется обычным `formatNumber` для standard presets.
450
+
451
+ ## Кеш `Intl.NumberFormat`
452
+
453
+ Модуль кеширует formatter по комбинации `decimals + grouping`, что важно для сотен ячеек таблицы.
454
+
455
+ ```ts
456
+ clearFormatCache();
457
+ ```
458
+
459
+ `clearFormatCache` очищает только кеш `Intl.NumberFormat`. Она не очищает и не сбрасывает реестр presets. В прикладном коде вызывать её обычно не нужно.
460
+
461
+ ## Практические рецепты
462
+
463
+ ### Безопасный вывод значения API
464
+
465
+ ```ts
466
+ const parsed = toFiniteNumber(response.amount);
467
+ const amountText = parsed === undefined ? "—" : formatNumberAsDecimal2(parsed);
468
+ ```
469
+
470
+ ### Поле, где ноль нужно скрыть
471
+
472
+ ```ts
473
+ const text = formatNumberAsIntegerOrEmpty(row.count);
474
+ ```
475
+
476
+ ### Проверка положительного page size
477
+
478
+ ```ts
479
+ const pageSize = toPositiveInteger(search.pageSize) ?? 20;
480
+ ```
481
+
482
+ ### Собственный preset на старте приложения
483
+
484
+ ```ts
485
+ export function configureFormatters(): void {
486
+ registerNumberPreset({
487
+ name: "quantity-4",
488
+ decimals: 4,
489
+ grouping: false
490
+ });
491
+ }
492
+ ```
493
+
494
+ ## Частые ошибки
495
+
496
+ ### Передавать локализованную строку прямо в `formatNumber`
497
+
498
+ ```ts
499
+ // Неправильно
500
+ formatNumber("1 234,5", "decimal-2"); // "0"
501
+
502
+ // Правильно
503
+ const parsed = toFiniteNumber("1 234,5");
504
+ const text = parsed === undefined ? "—" : formatNumber(parsed, "decimal-2");
505
+ ```
506
+
507
+ ### Считать `percent` математическим процентом
508
+
509
+ Preset не умножает `0.25` на 100 и не добавляет `%`. Он выведет `0,25`.
510
+
511
+ ### Ожидать валютный символ
512
+
513
+ `currency` и `price` форматируют число, но не знают валюту.
514
+
515
+ ### Мутировать полученный preset
516
+
517
+ `getNumberPreset` возвращает реестровый объект. Создайте новый объект или вызовите `registerNumberPreset` с полной новой конфигурацией.
518
+
519
+ ### Регистрировать preset во время рендера
520
+
521
+ Это глобальное изменение. Настраивайте реестр один раз до построения runtime.
522
+
523
+ ## API-справка
524
+
525
+ | Семейство | Публичный API |
526
+ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
527
+ | Универсальное форматирование | `formatNumber` |
528
+ | Готовые форматы | `formatNumberAsInteger`, `formatNumberAsCurrency`, `formatNumberAsDecimal`, `formatNumberAsDecimal2`, `formatNumberAsDecimal3`, `formatNumberAsPercent`, `formatNumberAsPrice`, `formatNumberAsTonnage` |
529
+ | Ноль как пустое | все перечисленные wrappers с суффиксом `OrEmpty` |
530
+ | Парсинг | `toFiniteNumber`, `parseNumber`, `isPositiveValue`, `toPositiveInteger` |
531
+ | Проверка нуля | `isZeroValue` |
532
+ | Presets | `DEFAULT_NUMBER_PRESET_NAMES`, `NUMBER_FORMAT_DEFAULTS`, `getNumberPreset`, `getNumberPresetNames`, `registerNumberPreset`, `resetNumberPresets` |
533
+ | Низкоуровневое | `truncateNumber`, `clearFormatCache` |
534
+ | Типы | `NumberFormatPreset`, `NumberFormatPresetConfig`, `NumberFormatCompactOptions`, `NumberFormatCompactUnit`, `NumberFormatCompactRoundingMode` |
535
+
536
+ `formatCompactNumber`, `formatNumberAsChartAxis` и `resolveNumberPreset` не входят в публичный entrypoint. Compact-поведение доступно через встроенные или собственные presets.
537
+
538
+ ## Связанная документация
539
+
540
+ - [Обзор `formatters`](../README.mdx)
541
+ - [Строковая нормализация](../strings/README.mdx)
542
+ - [Formatter pipeline](../pipeline/README.mdx)