mm_maths
Version:
这是一个可以将数学公式推导变形,并转成js和计算的模块。
161 lines (153 loc) • 3.48 kB
JavaScript
const multiply_divide = require('../multiply_divide');
const denominator = require('../../math/base/denominator');
/**
* 加减
* @param {String} expression 公式
*/
module.exports = function plus_subtract(expression) {
var expres = expression.replace(/\^\-/g, '^~');
expres = expres.replace(/ /g, '').replace(/\+/g, ' +').replace(/\-/g, ' -');
expres = expres.replace(/\^~/g, '^-');
var arr = expres.split(' ');
var dict = {};
var exp = "";
var num = 0;
var multiply = 0;
var divide = 1;
var multiply_str = "";
var divide_str = "";
// 统计代数个数
arr.map(function(x) {
var exp = "";
if (x.indexOf('-') === 0) {
exp = " -" + multiply_divide(x.replace('-', '')) + "";
} else {
if (x.indexOf('+') === 0) {
exp = x.replace('+', '');
} else {
exp = x;
}
exp = multiply_divide(exp) + "";
}
if (/[a-zA-Z]/.test(exp)) {
if (exp.indexOf(' -') === 0) {
if (exp.indexOf('^') !== -1 || exp.indexOf('/') !== -1) {
var key = exp.replace(' -', '');
// 代数加减
if (!dict[key]) {
dict[key] = -1;
} else {
dict[key] -= 1;
}
} else {
var key = exp.match(/[a-zA-Z]+/)[0];
var str = exp.replace(key, '');
var n = 1;
if(str)
{
if(str.trim() == '-')
{
n = -1;
}
else {
n = Number(str);
}
}
// 代数加减
if (!dict[key]) {
dict[key] = n;
} else {
dict[key] += n;
}
}
} else {
if (exp.indexOf('^') !== -1 || exp.indexOf('/') !== -1) {
var key = exp;
// 代数加减
if (!dict[key]) {
dict[key] = 1;
} else {
dict[key] += 1;
}
} else {
var key = exp.match(/[a-zA-Z]+/)[0];
var str = exp.replace(key, '');
var n = 1;
if(str)
{
if(str.trim() == '-')
{
n = -1;
}
else {
n = Number(str);
}
}
// 代数加减
if (!dict[key]) {
dict[key] = n;
} else {
dict[key] += n;
}
}
}
} else {
// 代数加减
if (exp.indexOf("^") !== -1) {
var mh = exp.match(/[0-9]+\^[0-9]+/);
if (mh) {
var key = mh[0];
var left = key.left("^");
var ex = "";
var right = key.right("^");
var n = Number(right);
for (var i = 0; i < n; i++) {
ex += " * (" + left + ")";
}
var value = eval(ex.replace(' * ', ''));
exp = exp.replace(key, value);
}
}
if (exp.indexOf("/") !== -1) {
var left = exp.left("/");
var right = exp.right("/");
var d = Number(right);
multiply = Number(left) * divide + multiply * d;
divide *= d;
} else {
num += Number(exp);
}
}
});
var result = '';
// 合并公式
for (var k in dict) {
var val = dict[k];
if (val === 1) {
result += ' +' + k
} else if (val !== 0) {
if (val > 0) {
result += ' +' + val + k
} else {
if (-val === 1) {
result += ' -' + k
} else {
result += val + k
}
}
}
}
if (num > 0) {
result += ' +' + num
} else if (num < 0) {
result += num
}
if (multiply !== 0) {
var o = denominator(multiply, divide);
result += " +" + o.multiply + '/' + o.divide;
}
if (result.indexOf(' +') === 0) {
result = result.replace(' +', '');
}
return result.replace(/\+ \-/g, ' -');
};