1 |
|
2 |
|
3 | import { bnToBn } from "../bn/toBn.js";
|
4 | import { isBoolean } from "../is/boolean.js";
|
5 | import { isUndefined } from "../is/undefined.js";
|
6 | import { formatDecimal } from "./formatDecimal.js";
|
7 | import { calcSi, findSi, SI, SI_MID } from "./si.js";
|
8 | const DEFAULT_DECIMALS = 0;
|
9 | const DEFAULT_UNIT = SI[SI_MID].text;
|
10 | let defaultDecimals = DEFAULT_DECIMALS;
|
11 | let defaultUnit = DEFAULT_UNIT;
|
12 |
|
13 | function getUnits(si, withSi, withSiFull, withUnit) {
|
14 | const unit = isBoolean(withUnit) ? SI[SI_MID].text : withUnit;
|
15 | return withSi || withSiFull ? si.value === '-' ? withUnit ? ` ${unit}` : '' : ` ${withSiFull ? `${si.text}${withUnit ? ' ' : ''}` : si.value}${withUnit ? unit : ''}` : '';
|
16 | }
|
17 |
|
18 | function getPrePost(text, decimals, forceUnit) {
|
19 |
|
20 |
|
21 |
|
22 | const si = calcSi(text, decimals, forceUnit);
|
23 | const mid = text.length - (decimals + si.power);
|
24 | const prefix = text.substring(0, mid);
|
25 | const padding = mid < 0 ? 0 - mid : 0;
|
26 | const postfix = `${`${new Array(padding + 1).join('0')}${text}`.substring(mid < 0 ? 0 : mid)}0000`.substring(0, 4);
|
27 | return [si, prefix || '0', postfix];
|
28 | }
|
29 |
|
30 |
|
31 | function _formatBalance(input, options = true, optDecimals = defaultDecimals) {
|
32 | let text = bnToBn(input).toString();
|
33 |
|
34 | if (text.length === 0 || text === '0') {
|
35 | return '0';
|
36 | }
|
37 |
|
38 |
|
39 | const {
|
40 | decimals = optDecimals,
|
41 | forceUnit = undefined,
|
42 | withSi = true,
|
43 | withSiFull = false,
|
44 | withUnit = true
|
45 | } = isBoolean(options) ? {
|
46 | withSi: options
|
47 | } : options;
|
48 |
|
49 |
|
50 | let sign = '';
|
51 |
|
52 | if (text[0].startsWith('-')) {
|
53 | sign = '-';
|
54 | text = text.substring(1);
|
55 | }
|
56 |
|
57 | const [si, prefix, postfix] = getPrePost(text, decimals, forceUnit);
|
58 | const units = getUnits(si, withSi, withSiFull, withUnit);
|
59 | return `${sign}${formatDecimal(prefix)}.${postfix}${units}`;
|
60 | }
|
61 |
|
62 | export const formatBalance = _formatBalance;
|
63 |
|
64 | formatBalance.calcSi = (text, decimals = defaultDecimals) => calcSi(text, decimals);
|
65 |
|
66 |
|
67 | formatBalance.findSi = findSi;
|
68 |
|
69 | formatBalance.getDefaults = () => {
|
70 | return {
|
71 | decimals: defaultDecimals,
|
72 | unit: defaultUnit
|
73 | };
|
74 | };
|
75 |
|
76 |
|
77 |
|
78 | formatBalance.getOptions = (decimals = defaultDecimals) => {
|
79 | return SI.filter(({
|
80 | power
|
81 | }) => power < 0 ? decimals + power >= 0 : true);
|
82 | };
|
83 |
|
84 |
|
85 |
|
86 | formatBalance.setDefaults = ({
|
87 | decimals,
|
88 | unit
|
89 | }) => {
|
90 | defaultDecimals = isUndefined(decimals) ? defaultDecimals : Array.isArray(decimals) ? decimals[0] : decimals;
|
91 | defaultUnit = isUndefined(unit) ? defaultUnit : Array.isArray(unit) ? unit[0] : unit;
|
92 | SI[SI_MID].text = defaultUnit;
|
93 | }; |
\ | No newline at end of file |