Skip to content

calc_wrap

calc_wrapcalc 的增强版本,支持柯里化调用和预配置。

基本签名

typescript
function calc_wrap<Expr, Fmt, Err, Options>(
  exprOrOptions: Expr | Options,
  optionsOrExpr?: Options | Expr
): string | number | Err | ((arg: any) => string | number | Err)

特点

  • 支持表达式优先或数据优先的调用方式
  • 支持柯里化(部分应用)
  • 默认 _error: '-'(不会抛出异常)
  • 灵活的参数顺序

使用方式

方式一:直接调用

javascript
import { calc_wrap } from 'a-calc'

// 与 calc 类似
calc_wrap('1 + 2')                           // '3'
calc_wrap('a + b', { a: 1, b: 2 })          // '3'

方式二:表达式优先(柯里化)

先传表达式,返回一个接收数据的函数:

javascript
const addAB = calc_wrap('a + b')
addAB({ a: 1, b: 2 })                        // '3'
addAB({ a: 10, b: 20 })                      // '30'

// 带格式化
const calcPrice = calc_wrap('price * qty | =2,')
calcPrice({ price: 99.9, qty: 1 })           // '99.90'
calcPrice({ price: 99.9, qty: 2 })           // '199.80'

方式三:数据优先(柯里化)

先传数据,返回一个接收表达式的函数:

javascript
const withData = calc_wrap({ a: 10, b: 20 })
withData('a + b')                            // '30'
withData('a * b')                            // '200'
withData('a - b')                            // '-10'

方式四:预配置

创建带有预设配置的计算函数:

javascript
// 创建预配置的计算函数
const calcMoney = calc_wrap({
  _fmt: '=2,',
  _unit: true,
  _error: '-'
})

calcMoney('100元 + 50元')                    // '150.00元'
calcMoney('price * qty', { price: '99元', qty: 3 })  // '297.00元'

与 calc 的区别

特性calccalc_wrap
错误处理抛异常默认返回 '-'
柯里化
参数顺序固定灵活
预配置

实际应用

表格数据处理

javascript
import { calc_wrap } from 'a-calc'

const data = [
  { price: 10, qty: 2 },
  { price: 20, qty: 3 },
  { price: 15, qty: 1 }
]

// 创建计算函数
const calcTotal = calc_wrap('price * qty | =2')

// 映射计算
const totals = data.map(item => calcTotal(item))
// ['20.00', '60.00', '15.00']

Vue/React 中使用

javascript
// Vue 示例
import { calc_wrap } from 'a-calc'

// 创建格式化金额的计算函数
const formatMoney = calc_wrap({ _fmt: '=2,' })

export default {
  computed: {
    formattedPrice() {
      return formatMoney(this.price)
    },
    totalAmount() {
      return formatMoney('price * quantity', {
        price: this.price,
        quantity: this.quantity
      })
    }
  }
}

复用计算逻辑

javascript
import { calc_wrap } from 'a-calc'

// 定义业务计算函数
const calcDiscount = calc_wrap('original * (1 - rate) | ~5=2')
const calcTax = calc_wrap('amount * taxRate | ~5=2')
const calcFinal = calc_wrap('subtotal + tax | =2,')

// 使用
const discounted = calcDiscount({ original: 100, rate: 0.2 })  // '80.00'
const tax = calcTax({ amount: 80, taxRate: 0.1 })              // '8.00'
const final = calcFinal({ subtotal: 80, tax: 8 })              // '88.00'
Ctrl+D 选择词, Ctrl+/ 注释

基于 MIT 许可发布