JavaScript实现复数字符串解析

JavaScript实现复数字符串解析

前言

好久没发文章了,最近要在微信小程序上实现复数字符串解析,百度了一下都是Java或者Python的居多,并且不能完全满足要求,所以自己写了一个。

支持格式

支持以下的这些复数字符串格式:

  1. 5.1+3.4i
  2. 8.1i+8.1
  3. 0.4i
  4. 3.4
  5. i7.1+3.4
  6. 3.9+i7.1
  7. 4+i
  8. i+1
  9. -i
  10. -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());
})

测试结果

测试结果如下图所示。应该是没有什么问题的。
测试结果

后语

有问题记得在评论区说一下,看到后马上修。看到这了点个赞再走呗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值