mirror of
https://gitee.com/baidu/amis.git
synced 2024-11-29 18:48:45 +08:00
fix: 调整pow函数实现逻辑,增加测试用例
This commit is contained in:
parent
f6d8964a61
commit
4f7c444397
@ -139,11 +139,17 @@ test('formula:math', async () => {
|
|||||||
expect(await evalFormual('UPPERMONEY(7682.01)')).toBe('柒仟陆佰捌拾贰元壹分');
|
expect(await evalFormual('UPPERMONEY(7682.01)')).toBe('柒仟陆佰捌拾贰元壹分');
|
||||||
expect(await evalFormual('UPPERMONEY(7682)')).toBe('柒仟陆佰捌拾贰元整');
|
expect(await evalFormual('UPPERMONEY(7682)')).toBe('柒仟陆佰捌拾贰元整');
|
||||||
|
|
||||||
|
expect(await evalFormual('POW(2,3)')).toBe(8);
|
||||||
|
expect(await evalFormual('POW(4,2)')).toBe(16);
|
||||||
|
|
||||||
// 非数字类型转换是否正常?
|
// 非数字类型转换是否正常?
|
||||||
expect(await evalFormual('"3" + "3"')).toBe(6);
|
expect(await evalFormual('"3" + "3"')).toBe(6);
|
||||||
expect(await evalFormual('"3" - "3"')).toBe(0);
|
expect(await evalFormual('"3" - "3"')).toBe(0);
|
||||||
expect(await evalFormual('AVG(4, "6", "10", 10, 10)')).toBe(8);
|
expect(await evalFormual('AVG(4, "6", "10", 10, 10)')).toBe(8);
|
||||||
expect(await evalFormual('MAX(4, "6", "10", 2, 3)')).toBe(10);
|
expect(await evalFormual('MAX(4, "6", "10", 2, 3)')).toBe(10);
|
||||||
|
expect(await evalFormual('POW("2","3")')).toBe(8);
|
||||||
|
expect(await evalFormual('POW("22.3",2)')).toBe(497.29);
|
||||||
|
expect(await evalFormual('POW("word2",2)')).toBe('word2');
|
||||||
|
|
||||||
expect(await evalFormual('"a" + "b"')).toBe('ab');
|
expect(await evalFormual('"a" + "b"')).toBe('ab');
|
||||||
});
|
});
|
||||||
|
@ -13,8 +13,6 @@ import uniqBy from 'lodash/uniqBy';
|
|||||||
import isEqual from 'lodash/isEqual';
|
import isEqual from 'lodash/isEqual';
|
||||||
import isPlainObject from 'lodash/isPlainObject';
|
import isPlainObject from 'lodash/isPlainObject';
|
||||||
import get from 'lodash/get';
|
import get from 'lodash/get';
|
||||||
import isNumber from 'lodash/isNumber';
|
|
||||||
import isString from 'lodash/isString';
|
|
||||||
import {EvaluatorOptions, FilterContext, FilterMap, FunctionMap} from './types';
|
import {EvaluatorOptions, FilterContext, FilterMap, FunctionMap} from './types';
|
||||||
import {FormulaEvalError} from './error';
|
import {FormulaEvalError} from './error';
|
||||||
|
|
||||||
@ -218,10 +216,21 @@ export class Evaluator {
|
|||||||
return value ?? 0;
|
return value ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 判断是否是数字或者字符串数字
|
||||||
|
isValidValue(value: string | number) {
|
||||||
|
return (
|
||||||
|
typeof value === 'number' ||
|
||||||
|
(typeof value === 'string' && /^\d+(\.\d+)?$/.test(value as string))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
power(ast: {left: any; right: any}) {
|
power(ast: {left: any; right: any}) {
|
||||||
const left = this.evalute(ast.left);
|
const left = this.evalute(ast.left);
|
||||||
const right = this.evalute(ast.right);
|
const right = this.evalute(ast.right);
|
||||||
return Math.pow(this.formatNumber(left), this.formatNumber(right));
|
if (!this.isValidValue(left) || !this.isValidValue(right)) {
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
return Math.pow(left, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
multiply(ast: {left: any; right: any}) {
|
multiply(ast: {left: any; right: any}) {
|
||||||
@ -1044,10 +1053,7 @@ export class Evaluator {
|
|||||||
* @returns {number} 基数的指数次幂
|
* @returns {number} 基数的指数次幂
|
||||||
*/
|
*/
|
||||||
fnPOW(base: number, exponent: number) {
|
fnPOW(base: number, exponent: number) {
|
||||||
const isValidValue = (value: string | number) => {
|
if (!this.isValidValue(base) || !this.isValidValue(exponent)) {
|
||||||
return isNumber(value) || (isString(value) && /^[0-9]+$/.test(value));
|
|
||||||
};
|
|
||||||
if (!isValidValue(base) || !isValidValue(exponent)) {
|
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user