前言
好久没发文章了,最近要在微信小程序上实现复数字符串解析,百度了一下都是Java或者Python的居多,并且不能完全满足要求,所以自己写了一个。
支持格式
支持以下的这些复数字符串格式:
- 5.1+3.4i
- 8.1i+8.1
- 0.4i
- 3.4
- i7.1+3.4
- 3.9+i7.1
- 4+i
- i+1
- -i
- -0.1i-0.3
代码
直接上应用代码,代码中把复数封装成了一个类
class Complex {
//实部
real;
//虚部
imag;
/**
*
* @param real 实部
* @param imag 虚部
*/
constructor(real, imag) {
this.real = real;
this.imag = imag;
}
/**
* 获取坐标方式的表示字符串
*/
toString() {
return "Complex{" +
"real=" + this.real +
", imag=" + this.imag +
'}';
}
/**
* 从字符串中分离出复数
* @param input 一个坐标复数
*/
static fromModelString(input) {
//替换所有无用符号
input = input.replace(/[ \r\n\t]/g, '');
//坐标法表示的复数
//i前有数字的匹配模式
const re_forward = /[+-]?[0-9]*\.?[0-9]*i/;
//i后有数字的匹配模式
const re_backward = /[+-]?i[+-]?[0-9]*\.?[0-9]*/;
let i_loc = input.search('i');
let imag = 0;
let real = 0;
let flag = 0;
if (i_loc == -1) {
//没有i符号
return new Complex(parseFloat(input), 0);
}
//虚数部分
if (input.search(/^i[+-]/) != -1 || input.search(/\+i$/) != -1 || input.search(/^i$/) != -1) {
//i前后的1省略了
imag = 1;
} else if (input.search(/-i$/) != -1 || input.search(/^-i/) != -1) {
imag = -1;
} else if (i_loc > 0 && input[i_loc - 1].search(/[0-9\.]/) != -1) {
//i前有数字
//提取i前所有的数字
let foo = input.match(re_forward).toString().replace('i', '');
imag = parseFloat(foo);
flag = 1;
} else if (input[i_loc + 1].search(/[0-9\.]/) != -1) {
//i后有数字
let foo = input.match(re_backward).toString().replace('i', '');
imag = parseFloat(foo);
flag = 2;
}
//实数部分
let foo_real;
switch (flag) {
case 0:
foo_real = input.replace(/[+-]?i/, '');
break;
case 1:
foo_real = input.replace(re_forward, '');
break;
case 2:
foo_real = input.replace(re_backward, '');
break;
}
if (foo_real != '') {
real = parseFloat(foo_real);
}
return new Complex(real, imag);
}
}
测试代码
let test_list = ['5.1+3.4i', '8.1i+8.1', '0.4i', '3.4', 'i7.1+3.4', '3.9+i7.1', '4+i', 'i+1', '-i', '-0.1i-0.3'];
test_list.forEach(o => {
console.log(Complex.fromModelString(o).toString());
})
测试结果
测试结果如下图所示。应该是没有什么问题的。
后语
有问题记得在评论区说一下,看到后马上修。看到这了点个赞再走呗?