a-calc
来源于实际业务的字符串四则运算的库, 可以解决js数字计算精度 科学记数法和格式化的问题, 支持千分位小数点格式化输出和带单位数字的计算等操作
支持的运算符 : + - * / %
安装
npm install a-calc
引入
commonjs
const {calc, fmt} = require("a-calc")
const {calc, fmt} = require("a-calc/cjs")
es module
import {calc, fmt} from "a-calc"
const {calc, fmt} from "a-calc/es"
browser
<script src="node_modules/a-calc/browser/index.js"></script>
<script>
const {calc, fmt} = a_calc
</script>
四则运算
calc("0.1 + 0.2")
calc("0.1 + 0.2 * 0.3 / 0.4 * (0.5 + 0.6)")
填充变量并计算(重要)
计算后的值为精准值且不会出现科学计数法
let a = 0.000001
let b = 888.789
calc("a + b", {a,b})
calc("a * (b + c) % d + 7.123", [
{a: 1, b: 2},
{c: 3, d: 4}
])
calc("1 + o.a / arr[0].d",{
o: { a: 2 },
arr: [{ d: 8 }]
})
calc("a + b - c",[
{a: 1},
{b: 2, c: 3}
])
带单位的计算
实际情况不总是那么理想, 也许我们不得不计算两个百分比数字, 幸好现在a-calc支持这些操作, 但是请注意,单位会从第一个携带单位的数字上取, 后面的单位会被忽略
calc("1 + 2%", {_unit: true})
calc("1.123$$$ + 2.88% | + =6", {_unit: true})
计算并格式化
calc("0.1 + 0.2 | =2")
calc("0.11111 + 0.11111 | <=4")
calc("0.11 + 0.11 | <=4")
calc("0.1 + 0.2 | >= 5")
calc("0.0000001+ 0.0000001 | >= 5")
calc("1 + 1 | +")
calc("10000000 + 100000000 | ,")
calc("10000000 + 100000000 | +,=10")
只格式化
calc("0.1 | =2")
fmt("0.1 | =2")
fmt("1000000 | ,")
高级技巧
错误处理
通常直接使用calc做计算要求输入的计算式是完全正确的, 默认 a-calc 不会帮你处理计算式的错误, 这个可以自己做过滤, 但在项目里我们可能不想做这件事情那么就需要额外的高级API, 在输入的计算式有误的时候静默捕获并给出一个合适的返回值
calc("1 + 2sd + d",{
_fillData: {d: 3},
_error: "-",
})
calc("1 + 2sd + d", {
d: 8,
_error: "-"
})
默认格式化
在实际项目中可以利用默认格式化优化开发体验
calc("111111 + 11111 | ,",{_fmt: "=2"})
在项目中的使用姿势(vue为例)
在项目中编写庞大的第二个参数是不好的, 所以第二个参数你应该想办法固定他, 下面只是一个在VUE项目中的演示
import { calc, fmt } from 'a-calc'
Vue.mixin({
methods: {
calc (expr, obj) {
let dataArr = [this]
let _fmt = undefined
let _error = undefined
if (obj !== undefined) {
dataArr.unshift(obj)
if (obj._fmt !== undefined) {
_fmt = obj._fmt
}
if (obj._error !== undefined) {
_error = obj._error
}
}
return calc(expr, {
_fillData: dataArr,
_error: _error === undefined ? '-' : _error,
_fmt,
})
},
fmt (expr, obj) {
let dataArr = [this]
let _fmt = undefined
let _error = undefined
if (obj !== undefined) {
dataArr.unshift(obj)
if (obj._fmt !== undefined) {
_fmt = obj._fmt
}
if (obj._error !== undefined) {
_error = obj._error
}
}
return fmt(expr,
{
_fillData: dataArr,
_error: _error === undefined ? '-' : _error,
_fmt,
_unit: true
})
},
},
})
版本变更
- 0.0.72
- 支持单个数值的带单位写法, 例如
calc("1元", {_unit: true})
或者 fmt("1元 | =2",{_unit: true})
- 补充文档
注意
视频教程
待定
问题提交
(如果遇到了什么问题, 请第一时间向我发送反馈邮件, 718879459@qq.com 对于bug我会第一时间修复他)