@ryuzaki13/react-foundation-lib 2.33.0 → 2.35.0
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.
- package/dist/analytical-table/index.js +1 -1
- package/dist/binary/binaryToBlob.d.ts +4 -0
- package/dist/binary/binaryToBlob.d.ts.map +1 -1
- package/dist/binary/index.d.ts +2 -2
- package/dist/binary/index.d.ts.map +1 -1
- package/dist/binary/index.js +73 -54
- package/dist/binary/index.js.map +1 -1
- package/dist/binary/useBinaryFile.d.ts +14 -5
- package/dist/binary/useBinaryFile.d.ts.map +1 -1
- package/dist/chunks/{formatters-CMfD97RB.js → formatters-4P9iq3wB.js} +384 -377
- package/dist/chunks/formatters-4P9iq3wB.js.map +1 -0
- package/dist/chunks/{validate-rivmPJyV.js → validate-Drrm-CCz.js} +177 -168
- package/dist/chunks/validate-Drrm-CCz.js.map +1 -0
- package/dist/error-report/index.js +1 -1
- package/dist/excel/index.js +114 -112
- package/dist/excel/index.js.map +1 -1
- package/dist/excel/tableExport.d.ts.map +1 -1
- package/dist/formatters/index.js +3 -3
- package/dist/formatters/number/formatNumber.d.ts +2 -2
- package/dist/formatters/number/formatNumber.d.ts.map +1 -1
- package/dist/formatters/number/index.d.ts +1 -0
- package/dist/formatters/number/index.d.ts.map +1 -1
- package/dist/formatters/number/numberFormatConstants.d.ts +5 -0
- package/dist/formatters/number/numberFormatConstants.d.ts.map +1 -1
- package/dist/formatters/number/numberPresetNameConstants.d.ts +1 -0
- package/dist/formatters/number/numberPresetNameConstants.d.ts.map +1 -1
- package/dist/formatters/number/presets.d.ts +2 -1
- package/dist/formatters/number/presets.d.ts.map +1 -1
- package/dist/formatters/number/types.d.ts +3 -1
- package/dist/formatters/number/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/binary/README.mdx +38 -78
- package/src/excel/README.mdx +12 -0
- package/src/formatters/number/README.mdx +41 -7
- package/dist/chunks/formatters-CMfD97RB.js.map +0 -1
- package/dist/chunks/validate-rivmPJyV.js.map +0 -1
package/src/binary/README.mdx
CHANGED
|
@@ -4,7 +4,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
4
4
|
|
|
5
5
|
# Работа с бинарными данными
|
|
6
6
|
|
|
7
|
-
Модуль `binary` преобразует строковое бинарное содержимое в браузерный `Blob`, определяет предполагаемый MIME-тип документа и предоставляет React hook
|
|
7
|
+
Модуль `binary` преобразует строковое бинарное содержимое в браузерный `Blob`, определяет предполагаемый MIME-тип документа и предоставляет React hook, результат которого показывает, удалось ли определить MIME. Отдельная pure function `getBase64DecodedSize` проверяет стандартный Base64 payload и считает размер без декодирования в browser или server runtime.
|
|
8
8
|
|
|
9
9
|
Основной сценарий:
|
|
10
10
|
|
|
@@ -278,7 +278,7 @@ const raw = String.fromCharCode(65, 66, 67);
|
|
|
278
278
|
| Превратить base64 data URL в `Blob` | `binaryToBlob` |
|
|
279
279
|
| Превратить raw binary string в `Blob` | `binaryToBlob(..., ..., false)` |
|
|
280
280
|
| Предположить MIME по имени и данным | `detectMimeType` |
|
|
281
|
-
| В React получить `
|
|
281
|
+
| В React получить `Blob` и результат определения MIME | `useBinaryFile` |
|
|
282
282
|
| Скачать готовый `Blob` | `downloadFileFromBlob` из `/dom` |
|
|
283
283
|
| Прочитать пользовательский `File` | `readFile` или `readImageFile` из `/file` |
|
|
284
284
|
| Использовать известные filename и MIME | Вызвать `detectMimeType`/`binaryToBlob` вручную |
|
|
@@ -762,70 +762,41 @@ Fallback PDF является осознанным предметно-незав
|
|
|
762
762
|
### Сигнатура
|
|
763
763
|
|
|
764
764
|
```ts
|
|
765
|
-
|
|
765
|
+
type UseBinaryFileResult = {
|
|
766
766
|
data: {
|
|
767
767
|
blob: Blob;
|
|
768
768
|
mime: string;
|
|
769
|
+
isMimeDetected: boolean;
|
|
769
770
|
} | null;
|
|
770
771
|
error: string | null;
|
|
771
772
|
};
|
|
772
|
-
```
|
|
773
|
-
|
|
774
|
-
Hook принимает только base64/base64 data URL. Он всегда вызывает:
|
|
775
773
|
|
|
776
|
-
|
|
777
|
-
const mime = detectMimeType(undefined, bin);
|
|
778
|
-
const blob = binaryToBlob(bin, mime, true);
|
|
774
|
+
function useBinaryFile(bin: string | undefined): UseBinaryFileResult;
|
|
779
775
|
```
|
|
780
776
|
|
|
781
|
-
|
|
777
|
+
Hook принимает base64 или base64 data URL. Имя файла и MIME можно передать отдельно через `detectMimeType` и `binaryToBlob`.
|
|
782
778
|
|
|
783
779
|
### Возвращаемое состояние
|
|
784
780
|
|
|
785
|
-
| Поле | Значение
|
|
786
|
-
| ------- |
|
|
787
|
-
| `data` | `{ blob, mime }` | Декодирование завершилось успешно |
|
|
788
|
-
| `data` | `null`
|
|
789
|
-
| `error` | `string`
|
|
790
|
-
| `error` | `null`
|
|
791
|
-
|
|
792
|
-
### Lifecycle
|
|
793
|
-
|
|
794
|
-
Преобразование выполняется после commit в React effect:
|
|
795
|
-
|
|
796
|
-
1. первый render возвращает `{ data: null, error: null }`;
|
|
797
|
-
2. после commit effect обрабатывает `bin`;
|
|
798
|
-
3. успех записывает `{ blob, mime }` и очищает ошибку;
|
|
799
|
-
4. ошибка очищает `data` и записывает `String(error)`;
|
|
800
|
-
5. `undefined` или пустая строка очищают оба поля.
|
|
801
|
-
|
|
802
|
-
Пример последовательности:
|
|
803
|
-
|
|
804
|
-
| `bin` | Состояние после effect |
|
|
805
|
-
| --------------------- | ---------------------------------------------------------- |
|
|
806
|
-
| `undefined` | `{ data: null, error: null }` |
|
|
807
|
-
| `""` | `{ data: null, error: null }` |
|
|
808
|
-
| Корректный base64 PDF | `{ data: { blob, mime: "application/pdf" }, error: null }` |
|
|
809
|
-
| Некорректный base64 | `{ data: null, error: "Error: ..." }` |
|
|
810
|
-
| Строка из пробелов | Ошибка после удаления пробелов |
|
|
811
|
-
|
|
812
|
-
У hook нет отдельного `isLoading`/`isProcessing`. На первом render `data: null` и `error: null` может означать как отсутствие входа, так и ещё не выполненный effect.
|
|
813
|
-
|
|
814
|
-
### Смена `bin`
|
|
781
|
+
| Поле | Значение | Смысл |
|
|
782
|
+
| ------- | ------------------------------- | ------------------------------------ |
|
|
783
|
+
| `data` | `{ blob, mime, isMimeDetected }` | Декодирование завершилось успешно |
|
|
784
|
+
| `data` | `null` | Нет результата либо произошла ошибка |
|
|
785
|
+
| `error` | `string` | Строковое представление ошибки |
|
|
786
|
+
| `error` | `null` | Ошибки нет |
|
|
815
787
|
|
|
816
|
-
|
|
788
|
+
### Результат при рендере
|
|
817
789
|
|
|
818
|
-
|
|
790
|
+
Хук синхронно декодирует текущий `bin` при рендере. При смене `bin` результат сразу относится к новому входу. Мемоизация позволяет повторно использовать `Blob` при рендере с тем же `bin`.
|
|
819
791
|
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
```
|
|
792
|
+
| `bin` | Результат |
|
|
793
|
+
| ---------------------------------- | ----------------------------------------------------------------------- |
|
|
794
|
+
| `undefined` | `{ data: null, error: null }` |
|
|
795
|
+
| `""` | `{ data: null, error: null }` |
|
|
796
|
+
| Корректный base64 PDF | `data.mime === "application/pdf"`, `data.isMimeDetected === true` |
|
|
797
|
+
| Корректный base64 неизвестного типа | `data.mime === "application/octet-stream"`, `data.isMimeDetected === false` |
|
|
798
|
+
| Некорректный base64 | `{ data: null, error: "Error: ..." }` |
|
|
799
|
+
| Строка из пробелов | Ошибка после удаления пробелов |
|
|
829
800
|
|
|
830
801
|
### Определение MIME внутри hook
|
|
831
802
|
|
|
@@ -833,27 +804,22 @@ Hook не знает filename. Приоритет будет таким:
|
|
|
833
804
|
|
|
834
805
|
1. MIME из data URL;
|
|
835
806
|
2. сигнатура;
|
|
836
|
-
3. fallback `application/
|
|
807
|
+
3. fallback `application/octet-stream`.
|
|
837
808
|
|
|
838
|
-
|
|
809
|
+
Проверяйте `data.isMimeDetected` перед выбором просмотрщика. Значение `true` означает, что MIME взят из data URL или определён по сигнатуре. Значение `false` означает, что hook подставил нейтральный MIME и сохранил декодированные байты.
|
|
839
810
|
|
|
840
811
|
```tsx
|
|
841
812
|
const { data } = useBinaryFile("SGVsbG8=");
|
|
842
813
|
|
|
843
|
-
//
|
|
844
|
-
// data?.
|
|
814
|
+
// data?.mime === "application/octet-stream"
|
|
815
|
+
// data?.isMimeDetected === false
|
|
845
816
|
```
|
|
846
817
|
|
|
847
818
|
Если известны имя или MIME, вызывайте `detectMimeType` и `binaryToBlob` вручную.
|
|
848
819
|
|
|
849
820
|
### Ошибки и logging
|
|
850
821
|
|
|
851
|
-
При ошибке
|
|
852
|
-
|
|
853
|
-
1. вызывает внутренний `logError(error)`;
|
|
854
|
-
2. `logError` пишет ошибку в `console.error`;
|
|
855
|
-
3. возвращает `error: String(error)`;
|
|
856
|
-
4. очищает `data`.
|
|
822
|
+
При ошибке хук возвращает `{ data: null, error: String(error) }` во время рендера. После commit эффект передаёт исходную ошибку в `logError`, который пишет её в `console.error`.
|
|
857
823
|
|
|
858
824
|
Для обычного `Error` строка включает имя:
|
|
859
825
|
|
|
@@ -879,12 +845,12 @@ export function BinaryDocument(props: BinaryDocumentProps) {
|
|
|
879
845
|
return <p role="alert">Не удалось подготовить документ</p>;
|
|
880
846
|
}
|
|
881
847
|
|
|
882
|
-
if (!
|
|
848
|
+
if (!data) {
|
|
883
849
|
return <p>Документ не передан</p>;
|
|
884
850
|
}
|
|
885
851
|
|
|
886
|
-
if (!data) {
|
|
887
|
-
return <p
|
|
852
|
+
if (!data.isMimeDetected) {
|
|
853
|
+
return <p>Формат файла не распознан</p>;
|
|
888
854
|
}
|
|
889
855
|
|
|
890
856
|
return <DocumentViewer blob={data.blob} mime={data.mime} />;
|
|
@@ -936,7 +902,7 @@ Effect синхронизирует React с внешним browser API и си
|
|
|
936
902
|
Не используйте `useBinaryFile`, если:
|
|
937
903
|
|
|
938
904
|
- код выполняется вне React;
|
|
939
|
-
- MIME
|
|
905
|
+
- MIME передаётся отдельно от base64;
|
|
940
906
|
- нужно учитывать filename;
|
|
941
907
|
- данные являются raw binary string;
|
|
942
908
|
- результат нужен немедленно в event handler;
|
|
@@ -1148,19 +1114,13 @@ const mime = detectMimeType(fileName, payload);
|
|
|
1148
1114
|
const blob = binaryToBlob(payload, mime);
|
|
1149
1115
|
```
|
|
1150
1116
|
|
|
1151
|
-
### Hook
|
|
1152
|
-
|
|
1153
|
-
Причина: `useBinaryFile` не получает filename, сигнатура текста неизвестна, поэтому применяется PDF fallback.
|
|
1154
|
-
|
|
1155
|
-
Решения:
|
|
1117
|
+
### Hook вернул `isMimeDetected: false`
|
|
1156
1118
|
|
|
1157
|
-
-
|
|
1158
|
-
- вызвать функции вручную с известным MIME;
|
|
1159
|
-
- не использовать hook для этого контракта.
|
|
1119
|
+
Байты успешно декодированы. Их можно скачать как `application/octet-stream`. Если тип известен из метаданных, передайте его в data URL или вызовите `binaryToBlob` с этим MIME.
|
|
1160
1120
|
|
|
1161
1121
|
### MIME не совпал с содержимым
|
|
1162
1122
|
|
|
1163
|
-
Проверьте
|
|
1123
|
+
Проверьте порядок определения MIME в `detectMimeType`:
|
|
1164
1124
|
|
|
1165
1125
|
1. filename;
|
|
1166
1126
|
2. data URL;
|
|
@@ -1185,7 +1145,7 @@ data:<mime>,<percent-encoded-payload>
|
|
|
1185
1145
|
|
|
1186
1146
|
### Ошибка появляется в `console.error`
|
|
1187
1147
|
|
|
1188
|
-
|
|
1148
|
+
`useBinaryFile` логирует пойманную ошибку после commit. При прямом вызове `binaryToBlob` за журналирование отвечает вызывающий код.
|
|
1189
1149
|
|
|
1190
1150
|
### Object URL перестал работать
|
|
1191
1151
|
|
|
@@ -1260,7 +1220,7 @@ Base64 обычно примерно на треть больше исходно
|
|
|
1260
1220
|
|
|
1261
1221
|
### `detectMimeType` декодирует только начало
|
|
1262
1222
|
|
|
1263
|
-
|
|
1223
|
+
Для поиска сигнатуры декодируются первые 128 непробельных символов Base64. Распознавание data URL выполняется регулярным выражением над входной строкой и может просканировать весь payload. Последующий `binaryToBlob` обрабатывает полный payload.
|
|
1264
1224
|
|
|
1265
1225
|
### Рекомендации
|
|
1266
1226
|
|
|
@@ -1344,8 +1304,8 @@ import { binaryToBlob, detectMimeType, useBinaryFile } from "@ryuzaki13/react-fo
|
|
|
1344
1304
|
| `binaryToBlob` MIME | `application/octet-stream` |
|
|
1345
1305
|
| `binaryToBlob` input mode | base64 |
|
|
1346
1306
|
| `detectMimeType` fallback | `application/pdf` |
|
|
1347
|
-
| `useBinaryFile`
|
|
1348
|
-
| `useBinaryFile`
|
|
1307
|
+
| `useBinaryFile` fallback | `application/octet-stream` |
|
|
1308
|
+
| `useBinaryFile` без входа | `{ data: null, error: null }` |
|
|
1349
1309
|
| `useBinaryFile` raw binary support | Нет |
|
|
1350
1310
|
| Автоматическое создание object URL | Нет |
|
|
1351
1311
|
|
package/src/excel/README.mdx
CHANGED
|
@@ -379,6 +379,18 @@ decimals = 2 → #,##0.00
|
|
|
379
379
|
|
|
380
380
|
Для OData integer по умолчанию выбирается preset `integer`, для других чисел — `decimal`. Неизвестное имя preset игнорируется и заменяется подходящим default.
|
|
381
381
|
|
|
382
|
+
Preset с `style: "percent"` создаёт native процентную маску Excel по собственной точности. Встроенный `ratio-percent` использует два знака:
|
|
383
|
+
|
|
384
|
+
```text
|
|
385
|
+
decimals = 0 → #,##0%
|
|
386
|
+
decimals = 2 → #,##0.00%
|
|
387
|
+
decimals = 3 → #,##0.000%
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
В строке сохраняется исходная числовая доля: `0.2` с маской `#,##0.00%` Excel отображает как `20.00%`, а `1` — как `100.00%`. Разделитель при отображении зависит от локали Excel. Не умножайте значение заранее и не передавайте строку `"20%"`: масштабирование выполняет сама процентная маска.
|
|
391
|
+
|
|
392
|
+
Имена пользовательских presets не задают семантику: любой preset с `style: "percent"` получает процентную маску, а `style: "decimal"` или отсутствие `style` сохраняют обычную числовую маску. В частности, существующий `percent` без `style` по-прежнему создаёт `#,##0.00`. Сочетание процентного style с `compact` отклоняется общим resolver числовых presets; Excel не вводит отдельные правила валидации.
|
|
393
|
+
|
|
382
394
|
### Форматы дат из presets
|
|
383
395
|
|
|
384
396
|
По умолчанию:
|
|
@@ -74,6 +74,7 @@ const text = value === undefined ? "Некорректно" : formatNumber(value
|
|
|
74
74
|
| `currency` | 0 | Денежное число без символа валюты |
|
|
75
75
|
| `price` | 0 | Цена без символа валюты |
|
|
76
76
|
| `percent` | 2 | Процентное число без автоматического умножения и знака `%` |
|
|
77
|
+
| `ratio-percent` | 2 | Доля с процентным масштабированием и знаком `%` |
|
|
77
78
|
| `tonnage` | 1 | Тоннаж |
|
|
78
79
|
| `compact-currency` | 0 | Компактное число, усечение |
|
|
79
80
|
| `compact-currency-round` | 0 | Компактное число, округление |
|
|
@@ -97,6 +98,38 @@ import { DEFAULT_NUMBER_PRESET_NAMES, formatNumber } from "@ryuzaki13/react-foun
|
|
|
97
98
|
formatNumber(1234.5, DEFAULT_NUMBER_PRESET_NAMES.decimal2);
|
|
98
99
|
```
|
|
99
100
|
|
|
101
|
+
## Числовой процент и доля
|
|
102
|
+
|
|
103
|
+
`percent` и `formatNumberAsPercent` форматируют уже подготовленное число с двумя дробными знаками. `ratio-percent` принимает долю: числу `0.2` соответствует отображение `20,00%`. Передавать предварительно умноженное на 100 значение для этого preset не нужно.
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import {
|
|
107
|
+
DEFAULT_NUMBER_PRESET_NAMES,
|
|
108
|
+
NUMBER_PRESET_NAME_RATIO_PERCENT,
|
|
109
|
+
formatNumber,
|
|
110
|
+
formatNumberAsPercent
|
|
111
|
+
} from "@ryuzaki13/react-foundation-lib/formatters";
|
|
112
|
+
|
|
113
|
+
formatNumber(0.2, "percent"); // "0,20"
|
|
114
|
+
formatNumberAsPercent(0.2); // "0,20"
|
|
115
|
+
formatNumber(0.2, NUMBER_PRESET_NAME_RATIO_PERCENT); // "20,00%"
|
|
116
|
+
formatNumber(1, DEFAULT_NUMBER_PRESET_NAMES.ratioPercent); // "100,00%"
|
|
117
|
+
formatNumber(0, "ratio-percent"); // "0,00%"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Число остаётся неизменным; процентное масштабирование относится только к представлению. Для formatter pipeline достаточно обычного `typedValueFormat` с `numberPresetName: "ratio-percent"`, в том числе у числовой колонки с целочисленным типом `int`. Смена preset не изменяет числовую семантику формул.
|
|
121
|
+
|
|
122
|
+
Необязательное поле `NumberFormatPreset.style` задаёт способ представления: отсутствие поля или `"decimal"` сохраняет обычный числовой формат, `"percent"` отображает долю со знаком `%`. Встроенный `ratio-percent` использует два дробных знака, собственный preset использует свой `decimals`:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
registerNumberPreset({ name: "ratio-3", style: "percent", decimals: 3 });
|
|
126
|
+
formatNumber(0.12345, "ratio-3"); // "12,345%"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`style: "percent"` нельзя сочетать с `compact`: такая комбинация явно отклоняется. Существующие compact presets без marker сохраняют своё поведение.
|
|
130
|
+
|
|
131
|
+
При экспорте через `createTableExcelColumn` из `/excel` этот style создаёт native percentage mask с точностью preset. В строку книги передаётся исходное число `0.2`, а Excel отображает процент. Готовую строку `"20%"` или число `20` вместо доли передавать не следует. Формат старого `percent` остаётся обычным числовым.
|
|
132
|
+
|
|
100
133
|
## `formatNumber(value, presetOrName)`
|
|
101
134
|
|
|
102
135
|
```ts
|
|
@@ -109,7 +142,7 @@ function formatNumber(value: unknown, presetOrName: string | NumberFormatPreset)
|
|
|
109
142
|
2. вызывает `Number(value)`;
|
|
110
143
|
3. для `NaN` и бесконечности возвращает `"0"`;
|
|
111
144
|
4. находит preset по имени или использует переданный объект;
|
|
112
|
-
5. округляет и форматирует
|
|
145
|
+
5. округляет и форматирует число с учётом выбранного `style`;
|
|
113
146
|
6. применяет compact-семантику, если она задана.
|
|
114
147
|
|
|
115
148
|
```ts
|
|
@@ -175,7 +208,7 @@ formatNumberAsCurrency(1250); // "1 250", без ₽
|
|
|
175
208
|
formatNumberAsPercent(12.5); // "12,50", без %
|
|
176
209
|
```
|
|
177
210
|
|
|
178
|
-
|
|
211
|
+
Для доли со знаком `%` используйте `ratio-percent`. Другие суффиксы добавляйте на UI-уровне или используйте специализированный модуль единиц измерения.
|
|
179
212
|
|
|
180
213
|
## Wrappers `OrEmpty`
|
|
181
214
|
|
|
@@ -388,7 +421,7 @@ formatNumber(1234.5, "accounting-2"); // "1 234,50"
|
|
|
388
421
|
|
|
389
422
|
Регистрация глобальна для текущего экземпляра модуля. Выполняйте её один раз при старте приложения до компиляции formatter pipeline.
|
|
390
423
|
|
|
391
|
-
Имя не trim
|
|
424
|
+
Имя не trim-ится. Передавайте непустое устойчивое имя, не меняйте встроенные presets без явной необходимости и проверяйте числовые параметры. Сочетание `style: "percent"` с `compact` не поддерживается и отклоняется при регистрации или разрешении preset.
|
|
392
425
|
|
|
393
426
|
### `resetNumberPresets()`
|
|
394
427
|
|
|
@@ -426,7 +459,7 @@ formatNumber(1234567.89, {
|
|
|
426
459
|
|
|
427
460
|
Такой объект не попадает в реестр. Он полезен для локального стабильного правила; переиспользуемый формат лучше зарегистрировать централизованно.
|
|
428
461
|
|
|
429
|
-
|
|
462
|
+
Числовые параметры автоматически не валидируются. Используйте:
|
|
430
463
|
|
|
431
464
|
- `decimals` — целое неотрицательное число в диапазоне, допустимом `Intl.NumberFormat`;
|
|
432
465
|
- `groupingSize` — положительное целое число;
|
|
@@ -450,7 +483,7 @@ truncateNumber(123.789, -1); // 120
|
|
|
450
483
|
|
|
451
484
|
## Кеш `Intl.NumberFormat`
|
|
452
485
|
|
|
453
|
-
Модуль кеширует formatter по комбинации `decimals + grouping`, что важно для сотен ячеек таблицы.
|
|
486
|
+
Модуль кеширует formatter по комбинации `style + decimals + grouping`, что важно для сотен ячеек таблицы. Числовой и процентный режимы не используют один formatter даже при одинаковой точности.
|
|
454
487
|
|
|
455
488
|
```ts
|
|
456
489
|
clearFormatCache();
|
|
@@ -506,7 +539,7 @@ const text = parsed === undefined ? "—" : formatNumber(parsed, "decimal-2");
|
|
|
506
539
|
|
|
507
540
|
### Считать `percent` математическим процентом
|
|
508
541
|
|
|
509
|
-
Preset не умножает `0.25` на 100 и не добавляет `%`. Он выведет `0,25`.
|
|
542
|
+
Preset не умножает `0.25` на 100 и не добавляет `%`. Он выведет `0,25`. Для отображения доли как `25,00%` выбирайте `ratio-percent`.
|
|
510
543
|
|
|
511
544
|
### Ожидать валютный символ
|
|
512
545
|
|
|
@@ -529,7 +562,7 @@ Preset не умножает `0.25` на 100 и не добавляет `%`. О
|
|
|
529
562
|
| Ноль как пустое | все перечисленные wrappers с суффиксом `OrEmpty` |
|
|
530
563
|
| Парсинг | `toFiniteNumber`, `parseNumber`, `isPositiveValue`, `toPositiveInteger` |
|
|
531
564
|
| Проверка нуля | `isZeroValue` |
|
|
532
|
-
| Presets | `DEFAULT_NUMBER_PRESET_NAMES`, `NUMBER_FORMAT_DEFAULTS`, `getNumberPreset`, `getNumberPresetNames`, `registerNumberPreset`, `resetNumberPresets`
|
|
565
|
+
| Presets | `DEFAULT_NUMBER_PRESET_NAMES`, `NUMBER_PRESET_NAME_RATIO_PERCENT`, `NUMBER_FORMAT_DEFAULTS`, `getNumberPreset`, `getNumberPresetNames`, `registerNumberPreset`, `resetNumberPresets` |
|
|
533
566
|
| Низкоуровневое | `truncateNumber`, `clearFormatCache` |
|
|
534
567
|
| Типы | `NumberFormatPreset`, `NumberFormatPresetConfig`, `NumberFormatCompactOptions`, `NumberFormatCompactUnit`, `NumberFormatCompactRoundingMode` |
|
|
535
568
|
|
|
@@ -540,3 +573,4 @@ Preset не умножает `0.25` на 100 и не добавляет `%`. О
|
|
|
540
573
|
- [Обзор `formatters`](../README.mdx)
|
|
541
574
|
- [Строковая нормализация](../strings/README.mdx)
|
|
542
575
|
- [Formatter pipeline](../pipeline/README.mdx)
|
|
576
|
+
- [Excel](../../excel/README.mdx)
|