a-calc 1.3.7 → 1.3.8-beta.2023112902
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/README.md +348 -348
- package/a-calc.versions.js +2 -1
- package/browser/index.js +1 -1
- package/cjs/index.js +1 -0
- package/cjs/package.json +4 -0
- package/es/index.js +1 -0
- package/es/package.json +4 -0
- package/package.json +19 -19
- package/cjs/index.cjs +0 -1
- package/es/index.mjs +0 -1
package/README.md
CHANGED
|
@@ -1,348 +1,348 @@
|
|
|
1
|
-
# a-calc
|
|
2
|
-
A convenient library for accurate calculation and formatting of numbers, which can solve the following problems:
|
|
3
|
-
|
|
4
|
-
* Size: uncompressed size 56KB. Gzip compression size 18KB
|
|
5
|
-
* Make the number calculation of javascript accurate
|
|
6
|
-
* Other third-party libraries have poor coding experience and inconvenient formatting
|
|
7
|
-
* Scientific notation of possible output of numerical calculation
|
|
8
|
-
* Format digits, output digits in thousandths, format digits directly into percentages, keep signs of digits, output fractions directly, etc.
|
|
9
|
-
* Calculation or formatting of numbers with units, e.g.: `0.1% + 2%`
|
|
10
|
-
* Calculation in scientific notation, for example: `-2e3 + 6`
|
|
11
|
-
* Support four rounding rules: rounding to the end, rounding to one, rounding to five, rounding to six (a more accurate method)
|
|
12
|
-
|
|
13
|
-
> Supported operators : + - * / % **
|
|
14
|
-
|
|
15
|
-
**Language:** English | [简体中文](https://github.com/Autumn-one/a-calc-old/blob/main/README_ZH.md)
|
|
16
|
-
|
|
17
|
-
## Installation
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
npm install a-calc
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Import
|
|
24
|
-
|
|
25
|
-
**commonjs**
|
|
26
|
-
|
|
27
|
-
```js
|
|
28
|
-
const {calc, fmt} = require("a-calc")
|
|
29
|
-
// or
|
|
30
|
-
const {calc, fmt} = require("a-calc/cjs") // Note that this is written to explicitly specify the use of the cjs version which makes sense, some packaging tools will do a conversion of the syntax, directly write a-calc does not work (nuxt.js is), then replace it with a-calc/cjs try
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
**es module**
|
|
34
|
-
|
|
35
|
-
```js
|
|
36
|
-
import {calc, fmt} from "a-calc"
|
|
37
|
-
// or
|
|
38
|
-
const {calc, fmt} from "a-calc/es"
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**browser**
|
|
42
|
-
|
|
43
|
-
```html
|
|
44
|
-
<script src="node_modules/a-calc/browser/index.js"></script>
|
|
45
|
-
<script>
|
|
46
|
-
const {calc, fmt} = a_calc
|
|
47
|
-
</script>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Usage
|
|
51
|
-
|
|
52
|
-
```js
|
|
53
|
-
calc("0.1 + 0.2") // 0.3
|
|
54
|
-
|
|
55
|
-
// A little more complicated calculation
|
|
56
|
-
calc("0.1 + 0.2 * 0.3 / 0.4 * (0.5 + 0.6)") // 0.265
|
|
57
|
-
|
|
58
|
-
// Calculation of scientific notation
|
|
59
|
-
calc("-2e2 + 3e+2") // 100
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## About Spaces
|
|
63
|
-
|
|
64
|
-
Spaces are non-essential in the absence of ambiguity, and can even correctly parse the following writing `calc("-2e+2+3e+2")` which is difficult for the human eye to parse, but this is too low clarity, please do your best to write clearer code instead of shit! <span style="color: red;">Always include spaces in your formula, which is more beautiful and clear, just like the example I wrote!!!</span>
|
|
65
|
-
|
|
66
|
-
By the way, an ambiguous equation `calc("50%%2", {_unit: true})` This ambiguity obviously occurs when calculating with units, since the parser doesn't know whether your units are `%` or `%%` so you have to use spaces to give a clear meaning, the correct way to write it would be `calc("50% % 2", {_unit: true}) `
|
|
67
|
-
|
|
68
|
-
In short, always add space!
|
|
69
|
-
|
|
70
|
-
## Fill variables and calculate (important)
|
|
71
|
-
|
|
72
|
-
**The calculated value is accurate and there is no scientific counting method**
|
|
73
|
-
|
|
74
|
-
```js
|
|
75
|
-
let a = 0.000001
|
|
76
|
-
let b = 888.789
|
|
77
|
-
calc("a + b", {a,b}) // 0.000001 + 888.789 = 888.789001
|
|
78
|
-
|
|
79
|
-
calc("a * (b + c) % d + 7.123", [
|
|
80
|
-
{a: 1, b: 2},
|
|
81
|
-
{c: 3, d: 4}
|
|
82
|
-
]) // 8.123
|
|
83
|
-
|
|
84
|
-
// A little more complicated
|
|
85
|
-
calc("1 + o.a / arr[0].d",{
|
|
86
|
-
o: { a: 2 },
|
|
87
|
-
arr: [{ d: 8 }]
|
|
88
|
-
}) // 1.25
|
|
89
|
-
|
|
90
|
-
calc("a + b - c",[
|
|
91
|
-
{a: 1},
|
|
92
|
-
{b: 2, c: 3}
|
|
93
|
-
])
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## Calculation with unit
|
|
97
|
-
|
|
98
|
-
> The reality is not always ideal, maybe we have to calculate two percentage numbers, fortunately a-calc supports these operations now, but please note that the units will be taken from the first number carrying the unit, and the subsequent units will be ignored
|
|
99
|
-
|
|
100
|
-
```js
|
|
101
|
-
// It is important to note that this is required and not enabled by default, because calculations with units do some extra work, which is faster than calculations with numbers alone
|
|
102
|
-
calc("1 + 2%", {_unit: true}) // 3%
|
|
103
|
-
|
|
104
|
-
calc("1.123$$$ + 2.88% | + =6", {_unit: true}) // +4.003000$$$
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
After `1.0.6`, calculations with units can have more parameters, `_unit` can take values like `boolean | "on" | "off" | "auto" | "space"` The parameters look like a lot, but they are similar to the previous usage, `true "on" "auto"` has the same effect, it means that it automatically recognizes the number after the The biggest difference is that the `"space"` value means that only spaces are used as unit separators. For example, if your units happen to be `+-`, which would be recognized as an operator in normal mode, you can use the `"space"` mode, but then spaces are required, and you would write it like this: `calc ("2+- * 3")` The final result is: `6+-`
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
In practice, you may want the final result not to carry units automatically. In versions after `1.3.6`, you can remove the units from the result with the formatting parameter `!u`, or `!n` can output the number directly.
|
|
112
|
-
|
|
113
|
-
## Calculate and format
|
|
114
|
-
|
|
115
|
-
Formatting supports the following features: limit decimal places, Keep Plus and minus signs, percentage output, scientific notation output, and kilobyte output, and they can be combined, but there are individual combinations that are not valid, try This yourself. There are too many combinations to list one by one.
|
|
116
|
-
|
|
117
|
-
**Formatted list:**
|
|
118
|
-
|
|
119
|
-
- `>|>=|<|<=|=Numeric` means restrict the number of decimal places, for example: `<=2` the number of decimal places is less than or equal to 2 `>3` the number of decimal places must be greater than 3, this is equivalent to `>=4`
|
|
120
|
-
- `,` The output is a string of digits in the thousandths
|
|
121
|
-
- `/` Output as fraction
|
|
122
|
-
- `+` Output positive numbers with `+` sign
|
|
123
|
-
- `%` Output a percentage number that can be used in combination with restricted decimals
|
|
124
|
-
- `!e` The output is scientific notation and e can be capitalized
|
|
125
|
-
- `!n` The output is a number rather than a numeric string, n can be capitalized, and after version 1.3.6 this has the highest priority, any other formatting parameter cannot affect this parameter.
|
|
126
|
-
- `!u` Remove units from results
|
|
127
|
-
|
|
128
|
-
```js
|
|
129
|
-
// Operational decimal places
|
|
130
|
-
calc("0.1 + 0.2 | =2") // 0.30
|
|
131
|
-
calc("0.11111 + 0.11111 | <=4") // 0.2222
|
|
132
|
-
calc("0.11 + 0.11 | <=4") // 0.22
|
|
133
|
-
calc("0.1 + 0.2 | >= 5") // 0.30000
|
|
134
|
-
calc("0.0000001+ 0.0000001 | >= 5") // 0.0000002
|
|
135
|
-
|
|
136
|
-
// Keep the sign
|
|
137
|
-
calc("1 + 1 | +") // +2
|
|
138
|
-
|
|
139
|
-
// thousands
|
|
140
|
-
calc("10000000 + 100000000 | ,") // 110,000,000
|
|
141
|
-
|
|
142
|
-
// Fraction
|
|
143
|
-
calc("0.025 + 0.2 | /") // 9/40
|
|
144
|
-
|
|
145
|
-
// Percentage
|
|
146
|
-
calc("1 + 1 | %") // 200%
|
|
147
|
-
|
|
148
|
-
// Scientific notation, notice that this e can also be capitalized
|
|
149
|
-
calc("1 + 1 | !e") // 2e+0
|
|
150
|
-
|
|
151
|
-
// Specifies both the decimal and the thousandth digits and leaves the sign plus or minus
|
|
152
|
-
calc("10000000 + 100000000 | +,=10") // +110,000,000.0000000000
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
## Four rounding rules
|
|
156
|
-
|
|
157
|
-
The rounding rule is added to the part of the format string, whose symbols are respectively:
|
|
158
|
-
|
|
159
|
-
- `~-` Tail off, default rounding rule
|
|
160
|
-
- `~+` Enter One
|
|
161
|
-
- `~5` Rounding
|
|
162
|
-
- `~6` This rounding rule is more accurate than rounding. The rule is different when the last digit of the rounding rule is 5. It looks at the position after 5, and if the last digit is not 0, it goes to 1, if the following number is 0, then you will see if the number before 5 is even, if it is not enter, not enter
|
|
163
|
-
|
|
164
|
-
```js
|
|
165
|
-
calc("0.11 + 0.22 | =1 ~+") // 0.4 Keep one digit and enter one
|
|
166
|
-
calc("0.55 | =1 ~5") // 0.6
|
|
167
|
-
calc("0.65 | =1 ~6") // 0.6
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
This newly added rounding rule seems to make the formatted part longer, but this is not the case. Generally, the rounding rule of an item is fixed, so the formatting of the rounding rule part should be encapsulated in the default formatting parameters. In actual use, there is no need to write this part at all. Refer to the "Default Format" description below
|
|
171
|
-
|
|
172
|
-
## Format only
|
|
173
|
-
|
|
174
|
-
```js
|
|
175
|
-
calc("0.1 | =2") // 0.10
|
|
176
|
-
fmt("0.1 | =2") // 0.10
|
|
177
|
-
// Calc has the functionality of fmt, but fmt has better semantics
|
|
178
|
-
|
|
179
|
-
fmt("1000000 | ,") // 1,000,000
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## Configure version number printing and library update detection
|
|
183
|
-
|
|
184
|
-
You can turn the console on or off to print the version number of the current library, or you can turn the console on or off to prompt if there is a new version update.
|
|
185
|
-
|
|
186
|
-
```typescript
|
|
187
|
-
import { calc_util } from "a-calc"
|
|
188
|
-
calc_util.print_version(); // Print version in console
|
|
189
|
-
calc_util.check_update(); // Enable the update detection function, if there are updates will be alerted in the console
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## Advanced skills
|
|
193
|
-
|
|
194
|
-
**Error Handling**
|
|
195
|
-
|
|
196
|
-
> Usually using calc directly requires the input formula to be completely correct. By default a-calc will not help you deal with the error of the formula. This can be filtered by yourself, but we may not want to do this in the project, so we need an extra advanced API to silently capture and give an appropriate return value when the input formula is wrong
|
|
197
|
-
|
|
198
|
-
```js
|
|
199
|
-
calc("1 + 2sd + d",{
|
|
200
|
-
_fill_data: {d: 3}, // From here, the data source object is assigned to _fill_data, which can also be an array of objects. When fetching data, it is successively searched from the array items, and the first one is immediately stopped
|
|
201
|
-
_error: "-", // Returns - as an alternative value if the equation is wrong
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
// The above writing can be simplified
|
|
205
|
-
calc("1 + 2sd + d", {
|
|
206
|
-
d: 8,
|
|
207
|
-
_error: "-"
|
|
208
|
-
}) // This simplification is simply for convenience
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
**Default formatting**
|
|
212
|
-
|
|
213
|
-
> Default formatting can be used to optimize the development experience in real projects
|
|
214
|
-
|
|
215
|
-
```js
|
|
216
|
-
calc("111111 + 11111 | ,",{_fmt: "=2"}) // 122,222.00 Obviously , and =2 are combined, and the formatted string in the expression has higher priority
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## How to re-encapsulate in the project?
|
|
220
|
-
|
|
221
|
-
The core ` calc ` function may not be extremely convenient in a real project, so ` a-calc ` provides a built-in secondary encapsulation function ` calc_wrap ` after version `1.2.10`, which is essentially an extension of ` calc `, so it has all the functions of the former, just more flexible writing and powerful type derivation.
|
|
222
|
-
|
|
223
|
-
Note that this may not be the only correct way to encapsulate. I just provide this function. There is no dogma here. You should be flexible in your own scenarios.
|
|
224
|
-
|
|
225
|
-
I suggest that if you decide to introduce ` calc_wrap ` into your project, you can rename it to ` calc ` so that you can write a few fewer characters. The following shows some flexible writing and powerful type derivation.
|
|
226
|
-
|
|
227
|
-
```typescript
|
|
228
|
-
// Note that calc_wrap is renamed calc here, because if you need to use the calc_wrap function, you basically don't need the core calc function, so if you have this idle name, you should use it
|
|
229
|
-
import { calc_wrap as calc } from "a-calc";
|
|
230
|
-
|
|
231
|
-
const state = {
|
|
232
|
-
a: 1,
|
|
233
|
-
b: 2,
|
|
234
|
-
c: 3
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
// When the parameter passed in is a formula without variable name, the calculation result will be returned directly
|
|
238
|
-
calc( "(1 + 2) * 3" ); // Return type: string
|
|
239
|
-
|
|
240
|
-
// When the incoming argument is a formula that is suspected to contain a variable name and there is no second data source argument, it returns a function waiting for the incoming data source. Yes, this function is done by statically typed derivation
|
|
241
|
-
calc( "(a + b) * c" ); // Return type: ( data: any ) => string
|
|
242
|
-
calc( "(a + b) * c" )( state ); // Return type: string
|
|
243
|
-
|
|
244
|
-
// Maybe you want to inject state first and then enter an expression, which is also ok
|
|
245
|
-
calc( state ); // Return type: ( expr: string | number ) => string
|
|
246
|
-
calc( state )( "(a + b) * c" ); // Return type: string
|
|
247
|
-
|
|
248
|
-
// The original usage is naturally supported
|
|
249
|
-
calc( "a + b + c", state ); // Return type: string
|
|
250
|
-
|
|
251
|
-
// You can still mix the configuration with the data source, which is very convenient
|
|
252
|
-
calc( "a + b + c" )( { ...state, _error: 0 } ); // Return type: string | 0
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
### Disrecommended writing
|
|
256
|
-
|
|
257
|
-
`a-calc` can be written using template strings, but I've found in practice that the readability of this writing is terrible, and it's not recommended unless you really have a valid enough reason to use template strings.
|
|
258
|
-
|
|
259
|
-
```typescript
|
|
260
|
-
calc(`${a} + ${b}`) // This writing style is not recommended
|
|
261
|
-
calc("a + b", {a,b}) // Recommended writing style because it is clearer
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
## Version change
|
|
267
|
-
|
|
268
|
-
* 1.3.6
|
|
269
|
-
- The `!n` formatting parameter is adjusted to the highest priority and any other formatting parameter cannot affect it.
|
|
270
|
-
- New `!u` formatting parameter to remove the unit part of the result
|
|
271
|
-
- Type Hint Enhancement
|
|
272
|
-
* 1.3.4
|
|
273
|
-
- Resolve the bug of rounding and rounding to six formatting errors(bug provider: nanarino)
|
|
274
|
-
* 1.3.0
|
|
275
|
-
- Disruptive changes: Adjust how the version number printing function and the detection update function are called
|
|
276
|
-
- Perfect type hint
|
|
277
|
-
- Add more unit tests
|
|
278
|
-
* 1.2.30
|
|
279
|
-
- Previous versions would have controlled the print version number by default, now it is configurable and turned off by default
|
|
280
|
-
- Provides the function of detecting updates, after opening if there is a new version of this will give a prompt in the console
|
|
281
|
-
* 1.2.10
|
|
282
|
-
- Remove the vue integration example, the library itself is not bound to a front-end framework, to avoid misunderstanding, remove the corresponding integration code.
|
|
283
|
-
- Add `calc_wrap` function, which is the second wrapping of the core function `calc` and can be used directly.
|
|
284
|
-
* 1.2.6
|
|
285
|
-
- Adjust the vue3 integration code, because the vue3 component instances differ between the development environment and the production environment, the production environment cannot get the state, but the development environment can.
|
|
286
|
-
* 1.2.0
|
|
287
|
-
- Very minor breaking update, the former `-e` and `-n` become `!e` and `!n` respectively
|
|
288
|
-
- Document update
|
|
289
|
-
* 1.1.0
|
|
290
|
-
- Very minor loop-breaking update, the previous `\e` scientific notation output is now `-e`, the rest is unchanged
|
|
291
|
-
- Added `-n` output number type
|
|
292
|
-
- Support `<` and `>` symbols for decimal place restrictions
|
|
293
|
-
- Fixed several rounding formatting issues
|
|
294
|
-
- Increased the number of unit tests to 107
|
|
295
|
-
* 1.0.25
|
|
296
|
-
- Documentation update to simplify writing a-calc integration to vue3
|
|
297
|
-
* 1.0.23
|
|
298
|
-
- Updated documentation to rewrite the recommended way to integrate a-calc into vue3
|
|
299
|
-
* 1.0.22
|
|
300
|
-
- Optimize fractional rounding logic
|
|
301
|
-
* 1.0.21
|
|
302
|
-
- Improve export type definition
|
|
303
|
-
* 1.0.19
|
|
304
|
-
- Fix the problem that _error may not catch errors when it is an empty string.
|
|
305
|
-
* 1.0.14
|
|
306
|
-
- Fix ** operator priority error.
|
|
307
|
-
- Fix for `<=` formatting that may have extra zeros not removed.
|
|
308
|
-
* 1.0.12
|
|
309
|
-
- Document add library volume description
|
|
310
|
-
- Fix the problem that the _error parameter is still abnormal when the expression is null, and add the corresponding unit test.
|
|
311
|
-
* 1.0.10
|
|
312
|
-
- Update documentation
|
|
313
|
-
* 1.0.6
|
|
314
|
-
* Destructive change: all exposed small humps are now snake naming, e.g. `_fillData` is now `_fill_data`, because the snake naming is clearer.
|
|
315
|
-
* The internal code has been greatly simplified and the parser has been almost completely rewritten to bring a more stable experience
|
|
316
|
-
* The original design was that the calc function had all the functionality of fmt, but while versions prior to 1.0.6 conformed to this design, calc and fmt were implemented separately, and now fmt is just an alias for calc.
|
|
317
|
-
* Support for the new operator **
|
|
318
|
-
* Support for new formatting characters % Can output numbers as percentages
|
|
319
|
-
* Support for the new formatting character `\e`, which can format numbers into scientific notation
|
|
320
|
-
* Fix a problem that may cause a dead loop when formatting an illegal string
|
|
321
|
-
* Fix the problem that 1/0 is Infinity.
|
|
322
|
-
* Add several unit tests
|
|
323
|
-
* More detailed type hints
|
|
324
|
-
* Update documentation to add sample code for vue3 integration
|
|
325
|
-
* 0.0.80
|
|
326
|
-
* Bring 4 types of rounding rules, which are: rounding to the end, rounding to one, rounding to five, rounding to six
|
|
327
|
-
* More boundary case detection
|
|
328
|
-
* fmt allows not passing in formatted strings, a feature that allows you to use fmt to remove extra zeros after the decimal point
|
|
329
|
-
* 0.0.79
|
|
330
|
-
* Update documentation
|
|
331
|
-
* 0.0.78
|
|
332
|
-
* Support for scientific notation calculations
|
|
333
|
-
* Full unit tests
|
|
334
|
-
* More boundary case detection
|
|
335
|
-
* 0.0.72
|
|
336
|
-
* Support for writing single values with units, e.g. `calc("$1", {_unit: true})` or `fmt("$1 | =2",{_unit: true})`
|
|
337
|
-
* Additional documentation
|
|
338
|
-
|
|
339
|
-
## Attention
|
|
340
|
-
|
|
341
|
-
- Do not wrap parentheses around a single number
|
|
342
|
-
|
|
343
|
-
## Question submission
|
|
344
|
-
|
|
345
|
-
(If you encounter any problems, please be the first to send me feedback email, 718879459@qq.com for bugs I will be the first to fix him)
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
1
|
+
# a-calc
|
|
2
|
+
A convenient library for accurate calculation and formatting of numbers, which can solve the following problems:
|
|
3
|
+
|
|
4
|
+
* Size: uncompressed size 56KB. Gzip compression size 18KB
|
|
5
|
+
* Make the number calculation of javascript accurate
|
|
6
|
+
* Other third-party libraries have poor coding experience and inconvenient formatting
|
|
7
|
+
* Scientific notation of possible output of numerical calculation
|
|
8
|
+
* Format digits, output digits in thousandths, format digits directly into percentages, keep signs of digits, output fractions directly, etc.
|
|
9
|
+
* Calculation or formatting of numbers with units, e.g.: `0.1% + 2%`
|
|
10
|
+
* Calculation in scientific notation, for example: `-2e3 + 6`
|
|
11
|
+
* Support four rounding rules: rounding to the end, rounding to one, rounding to five, rounding to six (a more accurate method)
|
|
12
|
+
|
|
13
|
+
> Supported operators : + - * / % **
|
|
14
|
+
|
|
15
|
+
**Language:** English | [简体中文](https://github.com/Autumn-one/a-calc-old/blob/main/README_ZH.md)
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
npm install a-calc
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Import
|
|
24
|
+
|
|
25
|
+
**commonjs**
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
const {calc, fmt} = require("a-calc")
|
|
29
|
+
// or
|
|
30
|
+
const {calc, fmt} = require("a-calc/cjs") // Note that this is written to explicitly specify the use of the cjs version which makes sense, some packaging tools will do a conversion of the syntax, directly write a-calc does not work (nuxt.js is), then replace it with a-calc/cjs try
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**es module**
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
import {calc, fmt} from "a-calc"
|
|
37
|
+
// or
|
|
38
|
+
const {calc, fmt} from "a-calc/es"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**browser**
|
|
42
|
+
|
|
43
|
+
```html
|
|
44
|
+
<script src="node_modules/a-calc/browser/index.js"></script>
|
|
45
|
+
<script>
|
|
46
|
+
const {calc, fmt} = a_calc
|
|
47
|
+
</script>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Usage
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
calc("0.1 + 0.2") // 0.3
|
|
54
|
+
|
|
55
|
+
// A little more complicated calculation
|
|
56
|
+
calc("0.1 + 0.2 * 0.3 / 0.4 * (0.5 + 0.6)") // 0.265
|
|
57
|
+
|
|
58
|
+
// Calculation of scientific notation
|
|
59
|
+
calc("-2e2 + 3e+2") // 100
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## About Spaces
|
|
63
|
+
|
|
64
|
+
Spaces are non-essential in the absence of ambiguity, and can even correctly parse the following writing `calc("-2e+2+3e+2")` which is difficult for the human eye to parse, but this is too low clarity, please do your best to write clearer code instead of shit! <span style="color: red;">Always include spaces in your formula, which is more beautiful and clear, just like the example I wrote!!!</span>
|
|
65
|
+
|
|
66
|
+
By the way, an ambiguous equation `calc("50%%2", {_unit: true})` This ambiguity obviously occurs when calculating with units, since the parser doesn't know whether your units are `%` or `%%` so you have to use spaces to give a clear meaning, the correct way to write it would be `calc("50% % 2", {_unit: true}) `
|
|
67
|
+
|
|
68
|
+
In short, always add space!
|
|
69
|
+
|
|
70
|
+
## Fill variables and calculate (important)
|
|
71
|
+
|
|
72
|
+
**The calculated value is accurate and there is no scientific counting method**
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
let a = 0.000001
|
|
76
|
+
let b = 888.789
|
|
77
|
+
calc("a + b", {a,b}) // 0.000001 + 888.789 = 888.789001
|
|
78
|
+
|
|
79
|
+
calc("a * (b + c) % d + 7.123", [
|
|
80
|
+
{a: 1, b: 2},
|
|
81
|
+
{c: 3, d: 4}
|
|
82
|
+
]) // 8.123
|
|
83
|
+
|
|
84
|
+
// A little more complicated
|
|
85
|
+
calc("1 + o.a / arr[0].d",{
|
|
86
|
+
o: { a: 2 },
|
|
87
|
+
arr: [{ d: 8 }]
|
|
88
|
+
}) // 1.25
|
|
89
|
+
|
|
90
|
+
calc("a + b - c",[
|
|
91
|
+
{a: 1},
|
|
92
|
+
{b: 2, c: 3}
|
|
93
|
+
])
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Calculation with unit
|
|
97
|
+
|
|
98
|
+
> The reality is not always ideal, maybe we have to calculate two percentage numbers, fortunately a-calc supports these operations now, but please note that the units will be taken from the first number carrying the unit, and the subsequent units will be ignored
|
|
99
|
+
|
|
100
|
+
```js
|
|
101
|
+
// It is important to note that this is required and not enabled by default, because calculations with units do some extra work, which is faster than calculations with numbers alone
|
|
102
|
+
calc("1 + 2%", {_unit: true}) // 3%
|
|
103
|
+
|
|
104
|
+
calc("1.123$$$ + 2.88% | + =6", {_unit: true}) // +4.003000$$$
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
After `1.0.6`, calculations with units can have more parameters, `_unit` can take values like `boolean | "on" | "off" | "auto" | "space"` The parameters look like a lot, but they are similar to the previous usage, `true "on" "auto"` has the same effect, it means that it automatically recognizes the number after the The biggest difference is that the `"space"` value means that only spaces are used as unit separators. For example, if your units happen to be `+-`, which would be recognized as an operator in normal mode, you can use the `"space"` mode, but then spaces are required, and you would write it like this: `calc ("2+- * 3")` The final result is: `6+-`
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
In practice, you may want the final result not to carry units automatically. In versions after `1.3.6`, you can remove the units from the result with the formatting parameter `!u`, or `!n` can output the number directly.
|
|
112
|
+
|
|
113
|
+
## Calculate and format
|
|
114
|
+
|
|
115
|
+
Formatting supports the following features: limit decimal places, Keep Plus and minus signs, percentage output, scientific notation output, and kilobyte output, and they can be combined, but there are individual combinations that are not valid, try This yourself. There are too many combinations to list one by one.
|
|
116
|
+
|
|
117
|
+
**Formatted list:**
|
|
118
|
+
|
|
119
|
+
- `>|>=|<|<=|=Numeric` means restrict the number of decimal places, for example: `<=2` the number of decimal places is less than or equal to 2 `>3` the number of decimal places must be greater than 3, this is equivalent to `>=4`
|
|
120
|
+
- `,` The output is a string of digits in the thousandths
|
|
121
|
+
- `/` Output as fraction
|
|
122
|
+
- `+` Output positive numbers with `+` sign
|
|
123
|
+
- `%` Output a percentage number that can be used in combination with restricted decimals
|
|
124
|
+
- `!e` The output is scientific notation and e can be capitalized
|
|
125
|
+
- `!n` The output is a number rather than a numeric string, n can be capitalized, and after version 1.3.6 this has the highest priority, any other formatting parameter cannot affect this parameter.
|
|
126
|
+
- `!u` Remove units from results
|
|
127
|
+
|
|
128
|
+
```js
|
|
129
|
+
// Operational decimal places
|
|
130
|
+
calc("0.1 + 0.2 | =2") // 0.30
|
|
131
|
+
calc("0.11111 + 0.11111 | <=4") // 0.2222
|
|
132
|
+
calc("0.11 + 0.11 | <=4") // 0.22
|
|
133
|
+
calc("0.1 + 0.2 | >= 5") // 0.30000
|
|
134
|
+
calc("0.0000001+ 0.0000001 | >= 5") // 0.0000002
|
|
135
|
+
|
|
136
|
+
// Keep the sign
|
|
137
|
+
calc("1 + 1 | +") // +2
|
|
138
|
+
|
|
139
|
+
// thousands
|
|
140
|
+
calc("10000000 + 100000000 | ,") // 110,000,000
|
|
141
|
+
|
|
142
|
+
// Fraction
|
|
143
|
+
calc("0.025 + 0.2 | /") // 9/40
|
|
144
|
+
|
|
145
|
+
// Percentage
|
|
146
|
+
calc("1 + 1 | %") // 200%
|
|
147
|
+
|
|
148
|
+
// Scientific notation, notice that this e can also be capitalized
|
|
149
|
+
calc("1 + 1 | !e") // 2e+0
|
|
150
|
+
|
|
151
|
+
// Specifies both the decimal and the thousandth digits and leaves the sign plus or minus
|
|
152
|
+
calc("10000000 + 100000000 | +,=10") // +110,000,000.0000000000
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Four rounding rules
|
|
156
|
+
|
|
157
|
+
The rounding rule is added to the part of the format string, whose symbols are respectively:
|
|
158
|
+
|
|
159
|
+
- `~-` Tail off, default rounding rule
|
|
160
|
+
- `~+` Enter One
|
|
161
|
+
- `~5` Rounding
|
|
162
|
+
- `~6` This rounding rule is more accurate than rounding. The rule is different when the last digit of the rounding rule is 5. It looks at the position after 5, and if the last digit is not 0, it goes to 1, if the following number is 0, then you will see if the number before 5 is even, if it is not enter, not enter
|
|
163
|
+
|
|
164
|
+
```js
|
|
165
|
+
calc("0.11 + 0.22 | =1 ~+") // 0.4 Keep one digit and enter one
|
|
166
|
+
calc("0.55 | =1 ~5") // 0.6
|
|
167
|
+
calc("0.65 | =1 ~6") // 0.6
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
This newly added rounding rule seems to make the formatted part longer, but this is not the case. Generally, the rounding rule of an item is fixed, so the formatting of the rounding rule part should be encapsulated in the default formatting parameters. In actual use, there is no need to write this part at all. Refer to the "Default Format" description below
|
|
171
|
+
|
|
172
|
+
## Format only
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
calc("0.1 | =2") // 0.10
|
|
176
|
+
fmt("0.1 | =2") // 0.10
|
|
177
|
+
// Calc has the functionality of fmt, but fmt has better semantics
|
|
178
|
+
|
|
179
|
+
fmt("1000000 | ,") // 1,000,000
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Configure version number printing and library update detection
|
|
183
|
+
|
|
184
|
+
You can turn the console on or off to print the version number of the current library, or you can turn the console on or off to prompt if there is a new version update.
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
import { calc_util } from "a-calc"
|
|
188
|
+
calc_util.print_version(); // Print version in console
|
|
189
|
+
calc_util.check_update(); // Enable the update detection function, if there are updates will be alerted in the console
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Advanced skills
|
|
193
|
+
|
|
194
|
+
**Error Handling**
|
|
195
|
+
|
|
196
|
+
> Usually using calc directly requires the input formula to be completely correct. By default a-calc will not help you deal with the error of the formula. This can be filtered by yourself, but we may not want to do this in the project, so we need an extra advanced API to silently capture and give an appropriate return value when the input formula is wrong
|
|
197
|
+
|
|
198
|
+
```js
|
|
199
|
+
calc("1 + 2sd + d",{
|
|
200
|
+
_fill_data: {d: 3}, // From here, the data source object is assigned to _fill_data, which can also be an array of objects. When fetching data, it is successively searched from the array items, and the first one is immediately stopped
|
|
201
|
+
_error: "-", // Returns - as an alternative value if the equation is wrong
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
// The above writing can be simplified
|
|
205
|
+
calc("1 + 2sd + d", {
|
|
206
|
+
d: 8,
|
|
207
|
+
_error: "-"
|
|
208
|
+
}) // This simplification is simply for convenience
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Default formatting**
|
|
212
|
+
|
|
213
|
+
> Default formatting can be used to optimize the development experience in real projects
|
|
214
|
+
|
|
215
|
+
```js
|
|
216
|
+
calc("111111 + 11111 | ,",{_fmt: "=2"}) // 122,222.00 Obviously , and =2 are combined, and the formatted string in the expression has higher priority
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## How to re-encapsulate in the project?
|
|
220
|
+
|
|
221
|
+
The core ` calc ` function may not be extremely convenient in a real project, so ` a-calc ` provides a built-in secondary encapsulation function ` calc_wrap ` after version `1.2.10`, which is essentially an extension of ` calc `, so it has all the functions of the former, just more flexible writing and powerful type derivation.
|
|
222
|
+
|
|
223
|
+
Note that this may not be the only correct way to encapsulate. I just provide this function. There is no dogma here. You should be flexible in your own scenarios.
|
|
224
|
+
|
|
225
|
+
I suggest that if you decide to introduce ` calc_wrap ` into your project, you can rename it to ` calc ` so that you can write a few fewer characters. The following shows some flexible writing and powerful type derivation.
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
// Note that calc_wrap is renamed calc here, because if you need to use the calc_wrap function, you basically don't need the core calc function, so if you have this idle name, you should use it
|
|
229
|
+
import { calc_wrap as calc } from "a-calc";
|
|
230
|
+
|
|
231
|
+
const state = {
|
|
232
|
+
a: 1,
|
|
233
|
+
b: 2,
|
|
234
|
+
c: 3
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// When the parameter passed in is a formula without variable name, the calculation result will be returned directly
|
|
238
|
+
calc( "(1 + 2) * 3" ); // Return type: string
|
|
239
|
+
|
|
240
|
+
// When the incoming argument is a formula that is suspected to contain a variable name and there is no second data source argument, it returns a function waiting for the incoming data source. Yes, this function is done by statically typed derivation
|
|
241
|
+
calc( "(a + b) * c" ); // Return type: ( data: any ) => string
|
|
242
|
+
calc( "(a + b) * c" )( state ); // Return type: string
|
|
243
|
+
|
|
244
|
+
// Maybe you want to inject state first and then enter an expression, which is also ok
|
|
245
|
+
calc( state ); // Return type: ( expr: string | number ) => string
|
|
246
|
+
calc( state )( "(a + b) * c" ); // Return type: string
|
|
247
|
+
|
|
248
|
+
// The original usage is naturally supported
|
|
249
|
+
calc( "a + b + c", state ); // Return type: string
|
|
250
|
+
|
|
251
|
+
// You can still mix the configuration with the data source, which is very convenient
|
|
252
|
+
calc( "a + b + c" )( { ...state, _error: 0 } ); // Return type: string | 0
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Disrecommended writing
|
|
256
|
+
|
|
257
|
+
`a-calc` can be written using template strings, but I've found in practice that the readability of this writing is terrible, and it's not recommended unless you really have a valid enough reason to use template strings.
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
calc(`${a} + ${b}`) // This writing style is not recommended
|
|
261
|
+
calc("a + b", {a,b}) // Recommended writing style because it is clearer
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
## Version change
|
|
267
|
+
|
|
268
|
+
* 1.3.6
|
|
269
|
+
- The `!n` formatting parameter is adjusted to the highest priority and any other formatting parameter cannot affect it.
|
|
270
|
+
- New `!u` formatting parameter to remove the unit part of the result
|
|
271
|
+
- Type Hint Enhancement
|
|
272
|
+
* 1.3.4
|
|
273
|
+
- Resolve the bug of rounding and rounding to six formatting errors(bug provider: nanarino)
|
|
274
|
+
* 1.3.0
|
|
275
|
+
- Disruptive changes: Adjust how the version number printing function and the detection update function are called
|
|
276
|
+
- Perfect type hint
|
|
277
|
+
- Add more unit tests
|
|
278
|
+
* 1.2.30
|
|
279
|
+
- Previous versions would have controlled the print version number by default, now it is configurable and turned off by default
|
|
280
|
+
- Provides the function of detecting updates, after opening if there is a new version of this will give a prompt in the console
|
|
281
|
+
* 1.2.10
|
|
282
|
+
- Remove the vue integration example, the library itself is not bound to a front-end framework, to avoid misunderstanding, remove the corresponding integration code.
|
|
283
|
+
- Add `calc_wrap` function, which is the second wrapping of the core function `calc` and can be used directly.
|
|
284
|
+
* 1.2.6
|
|
285
|
+
- Adjust the vue3 integration code, because the vue3 component instances differ between the development environment and the production environment, the production environment cannot get the state, but the development environment can.
|
|
286
|
+
* 1.2.0
|
|
287
|
+
- Very minor breaking update, the former `-e` and `-n` become `!e` and `!n` respectively
|
|
288
|
+
- Document update
|
|
289
|
+
* 1.1.0
|
|
290
|
+
- Very minor loop-breaking update, the previous `\e` scientific notation output is now `-e`, the rest is unchanged
|
|
291
|
+
- Added `-n` output number type
|
|
292
|
+
- Support `<` and `>` symbols for decimal place restrictions
|
|
293
|
+
- Fixed several rounding formatting issues
|
|
294
|
+
- Increased the number of unit tests to 107
|
|
295
|
+
* 1.0.25
|
|
296
|
+
- Documentation update to simplify writing a-calc integration to vue3
|
|
297
|
+
* 1.0.23
|
|
298
|
+
- Updated documentation to rewrite the recommended way to integrate a-calc into vue3
|
|
299
|
+
* 1.0.22
|
|
300
|
+
- Optimize fractional rounding logic
|
|
301
|
+
* 1.0.21
|
|
302
|
+
- Improve export type definition
|
|
303
|
+
* 1.0.19
|
|
304
|
+
- Fix the problem that _error may not catch errors when it is an empty string.
|
|
305
|
+
* 1.0.14
|
|
306
|
+
- Fix ** operator priority error.
|
|
307
|
+
- Fix for `<=` formatting that may have extra zeros not removed.
|
|
308
|
+
* 1.0.12
|
|
309
|
+
- Document add library volume description
|
|
310
|
+
- Fix the problem that the _error parameter is still abnormal when the expression is null, and add the corresponding unit test.
|
|
311
|
+
* 1.0.10
|
|
312
|
+
- Update documentation
|
|
313
|
+
* 1.0.6
|
|
314
|
+
* Destructive change: all exposed small humps are now snake naming, e.g. `_fillData` is now `_fill_data`, because the snake naming is clearer.
|
|
315
|
+
* The internal code has been greatly simplified and the parser has been almost completely rewritten to bring a more stable experience
|
|
316
|
+
* The original design was that the calc function had all the functionality of fmt, but while versions prior to 1.0.6 conformed to this design, calc and fmt were implemented separately, and now fmt is just an alias for calc.
|
|
317
|
+
* Support for the new operator **
|
|
318
|
+
* Support for new formatting characters % Can output numbers as percentages
|
|
319
|
+
* Support for the new formatting character `\e`, which can format numbers into scientific notation
|
|
320
|
+
* Fix a problem that may cause a dead loop when formatting an illegal string
|
|
321
|
+
* Fix the problem that 1/0 is Infinity.
|
|
322
|
+
* Add several unit tests
|
|
323
|
+
* More detailed type hints
|
|
324
|
+
* Update documentation to add sample code for vue3 integration
|
|
325
|
+
* 0.0.80
|
|
326
|
+
* Bring 4 types of rounding rules, which are: rounding to the end, rounding to one, rounding to five, rounding to six
|
|
327
|
+
* More boundary case detection
|
|
328
|
+
* fmt allows not passing in formatted strings, a feature that allows you to use fmt to remove extra zeros after the decimal point
|
|
329
|
+
* 0.0.79
|
|
330
|
+
* Update documentation
|
|
331
|
+
* 0.0.78
|
|
332
|
+
* Support for scientific notation calculations
|
|
333
|
+
* Full unit tests
|
|
334
|
+
* More boundary case detection
|
|
335
|
+
* 0.0.72
|
|
336
|
+
* Support for writing single values with units, e.g. `calc("$1", {_unit: true})` or `fmt("$1 | =2",{_unit: true})`
|
|
337
|
+
* Additional documentation
|
|
338
|
+
|
|
339
|
+
## Attention
|
|
340
|
+
|
|
341
|
+
- Do not wrap parentheses around a single number
|
|
342
|
+
|
|
343
|
+
## Question submission
|
|
344
|
+
|
|
345
|
+
(If you encounter any problems, please be the first to send me feedback email, 718879459@qq.com for bugs I will be the first to fix him)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|