【问题标题】:JavaScript - Regex Credit Card expiry date auto formatJavaScript - 正则表达式信用卡到期日期自动格式
【发布时间】:2020-05-10 05:15:29
【问题描述】:

我正在尝试编写一个函数,该函数将从输入元素中获取内容,并尝试将输入框中输入的数字格式化为 MM/YY。以下是我的解决方案,我想减少它的行数。谁能帮我写一个更好的函数来做到这一点?

如果你看到这个,它会自动插入斜杠。工作演示:https://codepen.io/ermauliks/pen/EXBryQ?editors=1010

function formatString(string) {
        return string.replace(
            /^([1-9]\/|[2-9])$/g, '0$1/' // To handle 3/ > 03/
        ).replace(
            /^(0[1-9]{1}|1[0-2]{1})$/g, '$1/' // 11 > 11/
        ).replace(
            /^([0-1]{1})([3-9]{1})$/g, '0$1/$2' // 13 > 01/3
        ).replace(
            /^(\d)\/(\d\d)$/g, '0$1/$2' // To handle 1/11 > 01/11
        ).replace(
            /^(0?[1-9]{1}|1[0-2]{1})([0-9]{2})$/g, '$1/$2' // 141 > 01/41
        ).replace(
            /^([0]{1,})\/|[0]{1,}$/g, '0' // To handle 0/ > 0 and 00 > 0
        ).replace(
            /[^\d\/]|^[\/]{0,}$/g, '' // To allow only numbers and /
        ).replace(
            /\/\//g, '/' // Prevent entering more than 1 /
        );
    }
    event.target.value = formatString(value);

【问题讨论】:

  • 如果您有工作代码,可以尝试在此处发布:codereview.stackexchange.com
  • @Maulik - 你能得到一个强大的解决方案吗?我正在寻求实现一个类似的。这里面的问题是,输入有效日期后,如果你编辑一个月,验证就不能正常工作了

标签: javascript regex


【解决方案1】:

这是一个增强版本,用户不输入/(自动添加)并允许删除(其他解决方案阻止删除斜杠):

function cc_expires_format(string) {
    return string.replace(
        /[^0-9]/g, '' // To allow only numbers
    ).replace(
        /^([2-9])$/g, '0$1' // To handle 3 > 03
    ).replace(
        /^(1{1})([3-9]{1})$/g, '0$1/$2' // 13 > 01/3
    ).replace(
        /^0{1,}/g, '0' // To handle 00 > 0
    ).replace(
        /^([0-1]{1}[0-9]{1})([0-9]{1,2}).*/g, '$1/$2' // To handle 113 > 11/3
    );
}

【讨论】:

    【解决方案2】:
        function formatString(e) {
      var inputChar = String.fromCharCode(event.keyCode);
      var code = event.keyCode;
      var allowedKeys = [8];
      if (allowedKeys.indexOf(code) !== -1) {
        return;
      }
    
      event.target.value = event.target.value.replace(
        /^([1-9]\/|[2-9])$/g, '0$1/' // 3 > 03/
      ).replace(
        /^(0[1-9]|1[0-2])$/g, '$1/' // 11 > 11/
      ).replace(
        /^1([3-9])$/g, '01/$1' // 13 > 01/3 //UPDATED by NAVNEET
      // ).replace(
      //   /^(0?[1-9]|1[0-2])([0-9]{2})$/g, '$1/$2' // 141 > 01/41
      ).replace(
        /^0\/|0+$/g, '0' // 0/ > 0 and 00 > 0 //UPDATED by NAVNEET
      ).replace(
        /[^\d|^\/]*/g, '' // To allow only digits and `/` //UPDATED by NAVNEET
      ).replace(
        /\/\//g, '/' // Prevent entering more than 1 `/`
      );
    }
    

    【讨论】:

    • 你好!要接受全年格式 mm/yyyy,需要进行哪些更改?
    【解决方案3】:

    您不能在用户键入的同时格式化某些内容,不要为此使用 onkeyup,想象一下用户的噩梦! (他想输入 12/18,当他输入 1 时,输入内容立即变为 01!)。

    我认为更好的方法是在表单中使用两个输入字段,并在输入字段失去焦点时使用 onblur 事件触发格式化函数:

    <script type="text/javascript">
    (function() {
        document.addEventListener('DOMContentLoaded', function() {
            var myform = document.getElementById('myform');
            function formatExpMonthYear() {
                var val = this.value.replace(/\D+/g, '');
                this.value = /^\d$/.test(val) ? '0' + val : val;
                // fire a validation function/display a validation icon
            }
            myform.elements.expMonth.addEventListener('blur', formatExpMonthYear);
            myform.elements.expYear.addEventListener('blur', formatExpMonthYear);
            myform.addEventListener('submit', function() {
                // fire validation functions/display validation icons
            });
        });
    })(); 
    </script>
    ...
    <form id="myform">
        <input placeholder="MM" type="text" name="expMonth" pattern="\d\d?"/>
        /
        <input placeholder="YY" type="text" name="expYear" pattern="\d\d?"/>
        <input type="submit"/>
    </form>
    

    【讨论】:

    • 谢谢,但是,这似乎不起作用,因为我的功能有效。它不包括少数情况。例如,如果我按13,它应该将日期格式设置为01/3
    • 这不是一个合理的日期,也许你可以将这个答案中的 str.relpace 存储到一个变量中。然后,检查它是否与传入的字符串匹配,如果匹配则它不是输入的有效日期(因为正则表达式没有重新格式化它)。您可能必须为输入无效日期的其他方式添加其他逻辑检查,但这将是一个开始
    • @MaulikSuchak:如果我理解得很好,您希望每次按键时都会更新输入字段内容,不是吗?
    • @CasimiretHippolyte 是的。
    • @MaulikSuchak:好的,我相信您想要在输入失去焦点时格式化字符串。如果我有想法,我会编辑我的答案。
    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多