【HTML】输入50个字符的字符串,按照条码格式解析

784 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

前言与需求

那天在群里,看到友仔在群里咨询,有没有老铁教教我呀~ 想起自己曾经无助的自己,我没有一刻停滞,我来帮你想想吧! image.png

经过

就简单跟这位同学说了一下思路,先这样;再那样;最后这样就ok了!
其实,笔者想到简单的就是先把这50个字符串,切割成对应的解析,最后再合并即可。(如果有其他大佬有更好的思路或者更好的建议,欢迎评论区交流~)

代码讲解和完整代码

由于代码比较简单,而且也有比较完整的注释;如果其他友友不懂的,欢迎评论区来问哈~

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>输入50个字符的字符串,按照条码格式解析</title>
</head>

<body>
    <input style="width: 500px;" id="input" type="text" placeholder="QDJA000001335D2017SUNOEBPOPTL000000000000000000000"
        value="QDJA000001335D2017SUNOEBPOPTL000000000000000000000">
    <button onclick="myClick()">解析</button>
</body>
<style>

</style>
<script>
    // 原理:50个字符串,分割指定长度大小;匹配对应条码格式即可

    // 车身颜色(对应关系)
    var carColorDB = {
        "EBPO": "酷感红",
        "ECPT": "珍珠白5",
        "EEPM": "凛冽青",
        "EEPN": "心悦蓝",
    };

    // 高低压(对应关系)
    var carPresDB = {
        "高压版": "#PTL8#,#PTH6#,#PTK8#,",
        "低压版": "#PTE2#,#PTG1#,#PTK7#,#PTM9#,#PTN6#,",
    }
    // 输入的条码字符串(20220515202022051522是预留的20位字符串)
    var codeText = "QDJA000001335D2017SUNOEBPOPTL8" + "20220515202022051522";
    function myClick() {
        var input = document.getElementById("input");
        var inputValue = input.value;
        console.log(inputValue);
        console.log(inputValue.length);
        var text = getCarEncode(inputValue);
        if (text) {
            alert(text);
        }
    }

    alert("测试demo\n" + getCarEncode(codeText));

    function getCarEncode(codeText) {
        if (!codeText || codeText.length != 50) { // 如果没传值或,值的大小不为50位,直接返回
            alert("请输入50位需要对应解析的车条码")
            return;
        }
        // 获取当前前10位的字符串(即车身号)
        var carNumber = codeText.slice(0, 10);
        // 获取第10~14位的字符串(即车型)
        var carModel = codeText.slice(10, 14);
        // 获取第14~18位的字符串(即车型年)
        var carYear = "车型年 " + codeText.slice(14, 18);
        // 获取第18~22(即天窗)
        var carWindos = codeText.slice(18, 22);
        // 获取第22~26(即车身颜色)
        var carColor = codeText.slice(22, 26);
        // 获取第26~30(即高低压)
        var carPres = codeText.slice(26, 30);
        // 预留的20位字符串(前10位:上线时间;后10位下线时间)
        var carDate = codeText.slice(30, 50);

        // 车型和车身颜色,直接拼接字符串即可
        var carModelStr = getCarModel(carModel); // 这里封装成一个方法

        var dateStr = getBetweenDate(carDate);

        var perfectText = carModelStr + "," + carYear + "," + getCarColor(carColor) + "," + getCarWindos(carWindos) + "," +
            getCarPres(carPres) + "," + dateStr;
        console.log(perfectText);
        return perfectText;
    }

    // console.log("条码字符串", codeText);
    // console.log("车身号", carNumber);
    // console.log("车型", carModel);
    // console.log("车型年", carYear);
    // console.log("天窗", carWindos);
    // console.log("车身颜色", carColor);
    // console.log("高低压", carPres);
    // console.log(getCarModel(carModel));

    // 拼接完整匹配对应的车型
    function getCarModel(carModel) {
        var isH = carModel.slice(carModel.length - 1, carModel.length);
        var text = isH == "H" ? "高配" : "低配";// 三元表达式 
        return carModel + "B_400_" + text;
    }

    // 计算对应时间,返回
    function getBetweenDate(carDate) {
        var startDate = carDate.slice(0, 10);
        var endDate = carDate.slice(10, 20);
        var betweenDate = endDate - startDate;
        if (betweenDate <= 0) {
            return "上线时间记录为零";
        }
        // console.log(sliceDate(startDate));
        // console.log(sliceDate(endDate));
        // console.log(betweenDate);
        var startDateMap = sliceDate(startDate);
        var endDateMap = sliceDate(endDate);
        var dateStr = "该车上线时间为" + getStringDate(startDateMap) + ",下线时间为" + getStringDate(endDateMap);
        // 计算年
        var betweenYear = endDateMap.year - startDateMap.year;
        // 相差的时间,字符串形式
        var dateText = "装配时间为";
        if (betweenYear > 0) {
            dateText += betweenYear + "年"; // 年
        }
        var betweenMonth = endDateMap.month - startDateMap.month;
        if (betweenMonth > 0) {
            dateText += betweenMonth + "月"; // 月
        }
        var betweenDay = endDateMap.day - startDateMap.day;
        if (betweenDay > 0) {
            dateText += betweenDay + "日"; // 日
        }
        var betweenTime = endDateMap.time - startDateMap.time;
        if (betweenTime > 0) {
            dateText += betweenTime + "小时"; // 时
        }


        return dateStr + "," + dateText;
    }


    // 获取对应字符串类型的日期(年、月、日、时间)
    function getStringDate(dateMap) {
        var { year, month, day, time } = dateMap;
        // 时间类型(1:上午;2:下午;3:晚上)
        var timeType = "上午";
        if (time < 6) {  // 时间在 0~6点之间
            timeType = "晚上";
        } else if (time < 12) { // 时间在 6~12点之间
            timeType = "上午";
        } else if (time < 18) { // 时间在 12~18点之间
            timeType = "下午";
        } else {
            timeType = "晚上";
        }
        if (time > 12) { // 超过12小时减去
            time -= 12;
        }
        return year + "年" + month + "月" + day + "日" + timeType + time + "点";
    }

    // 切割日期的字符串(返回map形式)
    function sliceDate(date) {
        var year = date.slice(0, 4);
        var month = date.slice(4, 6);
        if (month < 10) { // 避免出现月份带01月的格式
            month %= 10;
        }
        var day = date.slice(6, 8);
        if (day < 10) {  // 避免出现日带01日的格式
            day %= 10;
        }
        var time = date.slice(8, 10);
        return {
            year, month, day, time
        };
    }

    // 车身颜色处理
    function getCarColor(carColor) {
        return "颜色为" + carColorDB[carColor];
    }

    // 处理是否是否带天窗
    function getCarWindos(carWindos) {
        return carWindos == "SUN3" ? "带天窗" : "不带天窗";
    }

    // 匹配获取高低压版
    function getCarPres(carPres) {
        var pres = "";
        for (var key in carPresDB) {
            if (carPresDB[key].indexOf(carPres)) {
                pres = key;
                break;
            }
        }
        return pres;
    }

    showNanFangZheMsg();
    function showNanFangZheMsg() {
        console.log("*************************************************")
        console.log("****** 输入50个字符的字符串,按照条码格式解析 *******")
        console.log("************ 字符串解析 - 掘金 - 南方者 ***********")
        console.log("* https://juejin.cn/user/2840793779295133/posts *")
        console.log("************* https://nanfangzhe.cn/ ************")
        console.log("*************************************************")
    }
</script>
</html>

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)