## 数学计算公式

通过属性`math-exp`可以配置数学计算公式

   >注意:**参与计算的字段需要包含在一个作用域中，使用`v-form`指令声明为一个域**。
**`math-exp`表达式只在`cl-input`控件上生效**
```html
<template>
  <el-form :model="mathForm" label-width="80px" v-form>
    <cl-form-item label="数量">
      <cl-input 
      v-model="mathForm.count" 
      validate="required"
      ></cl-input>
    </cl-form-item>
    <cl-form-item label="单价">
      <cl-input 
      v-model="mathForm.price"
      validate="required"
      ></cl-input>
    </cl-form-item>
    <cl-form-item label="合计">
      <cl-input 
      v-model="mathForm.total"
      math-exp="{数量(mathForm.count)} * {单价(mathForm.price)}"
      ></cl-input>
    </cl-form-item>
    <cl-form-item label="大写">
      <cl-input 
      v-model="Capitalization"
      ></cl-input>
    </cl-form-item>
  </el-form>
    
</template>
<script>
  import FormMath from '@/math'
  export default {
    data() {
      return {
      mathForm:{
        count:'',
        price:'',
        total:''
      }
      };
    },
    computed:{
      Capitalization(){
        return FormMath.convertCurrency(this.mathForm.total)
      }
    },
  };
</script>
<!-- math-calc.vue -->
```
#### toNumber()
* 如果传入的值是` null,undefined,'' `,则返回空字符串
* 若传入的值是以逗号隔开的字符串数字则,仅返回数字
* 若传入的值是以`￥，$ `开头后面为数字,则返回数字
```html
<template>
  <el-form label-width="80px" v-form>
    <cl-form-item label="toNumber">
      <cl-input 
      v-model="test" 
      validate="required"
      ></cl-input>
    </cl-form-item>
    <cl-form-item label="结果">
      <div>{{FormMath.toNumber(test)}}</div>
    </cl-form-item>
  </el-form>
    
</template>
<script>
    export default {
      data() {
        return {
          FormMath,
          test:'$23',
        };
      },
    };
</script>
<!-- math-toNumber.vue -->
```
#### 其他公式
```html
<template>
  <el-form label-width="120px" v-form>
    <pre>
      arr1:[2,34,56,346,45,33,4,7,8]
      exp:'{单价(goods.price)} * {数量(goods.quantity)}'
      </pre>
    <cl-form-item label="arr1的最大值">
      <div>{{FormMath.max(arr1)}}</div>
    </cl-form-item>
    <cl-form-item label="arr1的最小值">
      <div>{{FormMath.min(arr1)}}</div>
    </cl-form-item>
    <cl-form-item label="arr1的最小值">
      <div>{{FormMath.min(arr1)}}</div>
    </cl-form-item><cl-form-item label="arr1的平均值">
      <div>{{FormMath.average(arr1)}}</div>
    </cl-form-item>
    <cl-form-item label="解析表达式">
      <cl-input v-model="exp" class="exp"></cl-input>
    </cl-form-item>
    <cl-form-item label="解析exp结果">
      <div>{{FormMath.parseFuncexpField(exp)}}</div>
    </cl-form-item>
    <cl-form-item label="求和sum">
      <cl-input v-model="item1" placeholder="数字1" type="number"></cl-input>
      <cl-input v-model="item2" placeholder="数字2" type="number"></cl-input>
      <cl-input 
        placeholder="总和"
        disabled
        v-model="FormMath.sum([item1,item2])"
      ></cl-input>
    </cl-form-item>
  </el-form>
    
</template>
<script>
    export default {
      data() {
        return {
          FormMath,
          arr1:[2,34,56,346,45,33,4,7,8],
          item1:'',
          item2:'',
          exp:'{单价(goods.price)} * {数量(goods.quantity)}'
        };
      },
    };
</script>
<style>
  .exp{
    width:40%;
  }
</style>
<!-- math-other.vue -->
```
#### 子表行计算
`FormMath.calcSubExpValue(exp, scope, prefix, index) exp计算表达式,scope包含子表数据的外层对象,prefix子表数据对象,index行索引`计算子表行
```html
<template>
    <ul class="math-ul" v-form>
      <li
        v-for="(row, index) in subTable.data.sub"
        :key="index"
        :data-index="index"
        data-subname="subTable.data.sub"
        >
        <div class="flex">
            <cl-input class="m-r" v-model="row.dj" placeholder="单价" />
            <cl-input class="m-r" v-model="row.sl" placeholder="数量" />
            <cl-input
            class="m-r"
            v-model="rowTotal(index)"
            placeholder="小计"
            disabled
            />
        </div>
        </li>
    </ul>
    
</template>
<script>
    export default {
      data() {
        return {
          FormMath,
          subTable:{
            data:{
              subSum:'',
              sub:[
                {
                  id:1,
                  dj:'',
                  sl:'',
                  xj:''
                },
                {
                  id:2,
                  dj:'',
                  sl:'',
                  xj:''
                },
                {
                  id:3,
                  dj:'',
                  sl:'',
                  xj:''
                }
              ]
            }
          }
        };
      },
      computed:{
        rowTotal(){
          const exp = '{单价(row.dj)} * {数量(row.sl)}'
          return ((index)=>{
             return FormMath.calcSubExpValue(exp, this.subTable, 'data.sub', index)
          })
        }
      }
    };
</script>
<style>
  .math-ul{
    list-style:none;
  }
</style>
<!-- math-calcSubExpValue.vue -->
```
#### 子表列计算
需要对子表中的某列求和时，可以通过表达式`exp="FormMath.sum([{小计(data.sub.xj)}])"和total=FormMath.calcExpValue(exp, scope),scope为存放子表数据对象`来完成求和运算,还可直接使用`math-exp="FormMath.sum([{小计(subTable.data.sub.xj)}])"`
+ 子表中的每行数据需要配置两个属性`:data-index="index"`和`data-subname="data.sub"`前者为当前行的索引，后者为子表对象在当前数据中对应的路径。
- 求和的表达式中`[{小计(data.sub.xj)}]`以数组包含对象的方式指向子表某一列，`data.sub.xj`中`data.sub`为数组对象，但是`sub`后面不需要添加`[i]`作为索引。
```html
<template>
    <ul class="math-ul" v-form>
      <li
        v-for="(row, index) in subTable.data.sub"
        :key="index"
        :data-index="index"
        data-subname="subTable.data.sub"
        >
        <div class="flex">
            <cl-input class="m-r" v-model="row.dj" placeholder="单价" />
            <cl-input class="m-r" v-model="row.sl" placeholder="数量" />
            <cl-input
            class="m-r"
            v-model="row.xj"
            placeholder="小计"
            disabled
            math-exp="{单价(row.dj)} * {数量(row.sl)}"
            />
        </div>
        </li>
        <li class="sum">
        <span>直接使用math-exp属性求和:</span>
        <cl-input
          class="m-r"
          v-model="subTable.data.subSum"
          placeholder="对子表中的小计求和"
          math-exp="FormMath.sum([{小计(subTable.data.sub.xj)}])"
          />
        </li>
        <li class="sum">
        <span>使用FormMath.sum和FormMath.calcExpValue公式求和:</span>
        <cl-input
          class="m-r"
          v-model="subTable.data.subSum"
          math-exp="FormMath.sum([{小计(subTable.data.sub.xj)}])"
          placeholder="对子表中的小计求和"
          />
        </li>
    </ul>
    
</template>
<script>
    export default {
      data() {
        return {
          FormMath,
          subTable:{
            data:{
              subSum:'',
              sub:[
                {
                  id:1,
                  dj:'',
                  sl:'',
                  xj:''
                },
                {
                  id:2,
                  dj:'',
                  sl:'',
                  xj:''
                },
                {
                  id:3,
                  dj:'',
                  sl:'',
                  xj:''
                }
              ]
            }
          }
        };
      }
    };
</script>
<style>
  .math-ul{
    list-style:none;
    width:40%;
  }
  .sum{
    margin-right:6px;
    display:flex;
    justify-content: space-between;
  }
</style>
<!-- math-subTable.vue -->
```


### 运算公式

|运算符|说明|示例|
|:--------|:--------|:--------|
|FormMath.abs(X)|取绝对值|`FormMath.abs({数字1(data.math1)} - {数字2(data.math2)})`|
|FormMath.round(X)|四舍五入为整数|`FormMath.round(3.1415)`结果为`3`|
|FormMath.ceil(X)|上舍入为整数（返回等于或大于X的整数）|`FormMath.ceil(3.1415)`结果为`4`|
|FormMath.floor(X)|下舍入为整数（返回等于或小于X的整数）|`FormMath.ceil(1.618)`结果为`1`|
|FormMath.max([...])|返回集合中的最大数|`FormMath.max([1,2,3,4,5,6])`结果为`6`|
|FormMath.min([...])|返回集合中的最小数|`FormMath.min([1,2,3,4,5,6])`结果为`1`|
|FormMath.sqrt(X)|返回X的平方根|`FormMath.sqrt(4)`结果为`2`|
|FormMath.average([...])|返回集合的平均值|`FormMath.average([1,2,3,4,5])`结果为`3`|
|FormMath.sum([...])|返回集合的和|`FormMath.sum([1,2,3,4,5])`的结果为`15`|
|FormMath.tofixed(X, Y)|返回保留小数点后Y位的X的四舍五入值|`FormMath.tofixed(3.14159265, 2)`的结果为`3.14`|
|FormMath.convertCurrency(X)|将数字转换为人民币大写|`FormMath.convertCurrency(123.45)`的结果为`壹佰贰拾叁元肆角伍分`|
|FormMath.isValue(x)|传入的值如果是`0,'',null,undefined,Infinity,false`返回空字符串|`FormMath.isValue(null)`的结果为`''`|
|FormMath.toNumber(X)|返回数字类型(能被Number()转换),若不能被Number转换则返回NaN|`FormMath.toNumber('$23')`结果为`23`|
|FormMath.parseFuncexpField(exp)|返回表达式中的字段|`FormMath.parseFuncexpField({单价(goods.price)} * {数量(goods.quantity)})`的结果为`[ "goods.price", "goods.quantity" ]`|
|FormMath.calcSubExpValue(exp,scope,prefix,index)|返回子表某行计算结果|示例请查看行计算|
|FormMath.calcExpValue(exp,scope)|返回表达式中的值的和|示例请查看子表计算|

