Format credit card number

后端 未结 10 2185
梦谈多话
梦谈多话 2020-12-08 11:27

How to format and validate a credit card number with spaces between each 4 digit while typing:

eg: 4464 6846 4354 3564

I have tried:

相关标签:
10条回答
  • 2020-12-08 12:05

    I couldn't find a reasonable solution that works with text editing, so here you go:

    $("#cardNumber").on("keydown", function(e) {
        var cursor = this.selectionStart;
        if (this.selectionEnd != cursor) return;
        if (e.which == 46) {
            if (this.value[cursor] == " ") this.selectionStart++;
        } else if (e.which == 8) {
            if (cursor && this.value[cursor - 1] == " ") this.selectionEnd--;
        }
    }).on("input", function() {
        var value = this.value;
        var cursor = this.selectionStart;
        var matches = value.substring(0, cursor).match(/[^0-9]/g);
        if (matches) cursor -= matches.length;
        value = value.replace(/[^0-9]/g, "").substring(0, 16);
        var formatted = "";
        for (var i=0, n=value.length; i<n; i++) {
            if (i && i % 4 == 0) {
                if (formatted.length <= cursor) cursor++;
                formatted += " ";
            }
            formatted += value[i];
        }
        if (formatted == this.value) return;
        this.value = formatted;
        this.selectionEnd = cursor;
    });
    

    The keydown listener is needed to adjust the cursor position for backspace and delete to move past spaces. It should not be used to restrict character entry, as you don't want to use key codes for that.

    The input listener rebuilds the text, strips non-numbers, adds spaces every 4 characters, and preserves the cursor position.

    0 讨论(0)
  • 2020-12-08 12:09

    With ES6

    export const formatCardNumber = value => {
      const regex = /^(\d{0,4})(\d{0,4})(\d{0,4})(\d{0,4})$/g
      const onlyNumbers = value.replace(/[^\d]/g, '')
    
      return onlyNumbers.replace(regex, (regex, $1, $2, $3, $4) =>
        [$1, $2, $3, $4].filter(group => !!group).join(' ')
      )
    }
    
    0 讨论(0)
  • 2020-12-08 12:14

    Try this:

    function cc_format(value) {
        var v = value.replace(/\s+/g, '').replace(/[^0-9]/gi, '')
        var matches = v.match(/\d{4,16}/g);
        var match = matches && matches[0] || ''
        var parts = []
    
        for (i=0, len=match.length; i<len; i+=4) {
            parts.push(match.substring(i, i+4))
        }
    
        if (parts.length) {
            return parts.join(' ')
        } else {
            return value
        }
    }
    

    Note: Check this for detailed information https://www.peterbe.com/plog/cc-formatter.

    To restrict the user to enter number only:

    Javascript Way

    <input type="text" id="txt_cardNumber" name="txt_cardNumber" onkeypress="return checkDigit(event)">
    
    function checkDigit(event) {
        var code = (event.which) ? event.which : event.keyCode;
    
        if ((code < 48 || code > 57) && (code > 31)) {
            return false;
        }
    
        return true;
    }
    

    OR

    function checkDigit() {
        var allowedChars = "0123456789";
        var entryVal = document.getElementById('txt_cardNumber').value();
        var flag;
    
        for(var i=0; i<entryVal.length; i++){       
            flag = false;
    
            for(var j=0; j<allowedChars.length; j++){
                if(entryVal.charAt(i) == allowedChars.charAt(j)) {
                    flag = true; 
                }
            }
    
            if(flag == false) { 
                entryVal = entryVal.replace(entryVal.charAt(i),""); i--; 
            }
        }
    
        return true;
    }
    

    HTML5 Way

    <input type="text" id="txt_cardNumber" name="txt_cardNumber" pattern="[0-9.]+">
    <input type="number" id="txt_cardNumber" name="txt_cardNumber">
    

    jQuery Way

    $("#txt_cardNumber").keypress(function (e) {
        if ((e.which < 48 || e.which > 57) && (e.which !== 8) && (e.which !== 0)) {
            return false;
        }
    
        return true;
    });
    

    Note: Please check here to get more information about various key code.

    0 讨论(0)
  • 2020-12-08 12:14

    Just wrote this to handle Visa, Discover, Master Card and Amex (with formatting and card type identification).

    // SAMPLE FIELD:   <input type="text" name="cstCCNumber" id="cstCCNumber" value=""onkeyup="cc_format('cstCCNumber','cstCCardType');">
        function cc_format(ccid,ctid) {
            // supports Amex, Master Card, Visa, and Discover
            // parameter 1 ccid= id of credit card number field
            // parameter 2 ctid= id of credit card type field
    
            var ccNumString=document.getElementById(ccid).value;
            ccNumString=ccNumString.replace(/[^0-9]/g, '');
            // mc, starts with - 51 to 55
            // v, starts with - 4
            // dsc, starts with 6011, 622126-622925, 644-649, 65
            // amex, starts with 34 or 37
            var typeCheck = ccNumString.substring(0, 2);
            var cType='';
            var block1='';
            var block2='';
            var block3='';
            var block4='';
            var formatted='';
    
            if  (typeCheck.length==2) {
                typeCheck=parseInt(typeCheck);
                if (typeCheck >= 40 && typeCheck <= 49) {
                    cType='Visa';
                }
                else if (typeCheck >= 51 && typeCheck <= 55) {
                    cType='Master Card';
                }
                else if ((typeCheck >= 60 && typeCheck <= 62) || (typeCheck == 64) || (typeCheck == 65)) {
                    cType='Discover';
                }
                else if (typeCheck==34 || typeCheck==37) {
                    cType='American Express';
                }
                else {
                    cType='Invalid';
                }
            }
    
            // all support card types have a 4 digit firt block
            block1 = ccNumString.substring(0, 4);
            if (block1.length==4) {
                block1=block1 + ' ';
            }
    
            if (cType == 'Visa' || cType == 'Master Card' || cType == 'Discover') {
                // for 4X4 cards
                block2 = ccNumString.substring(4, 8);
                if (block2.length==4) {
                    block2=block2 + ' ';
                }
                block3 = ccNumString.substring(8, 12);
                if (block3.length==4) {
                    block3=block3 + ' ';
                }
                block4 = ccNumString.substring(12, 16);
            }
            else if (cType == 'American Express') {
                // for Amex cards
                block2 =  ccNumString.substring(4, 10);
                if (block2.length==6) {
                    block2=block2 + ' ';
                }
                block3 =  ccNumString.substring(10, 15);
                block4='';
            }
            else if (cType == 'Invalid') {
                // for Amex cards
                block1 =  typeCheck;
                block2='';
                block3='';
                block4='';
                alert('Invalid Card Number');
            }
    
            formatted=block1 + block2 + block3 + block4;
            document.getElementById(ccid).value=formatted;
            document.getElementById(ctid).value=cType;
        }
    
    0 讨论(0)
  • 2020-12-08 12:14

    function cc_format(value) {
      var v = value.replace(/\s+/g, '').replace(/[^0-9]/gi, '')
      var matches = v.match(/\d{4,16}/g);
      var match = matches && matches[0] || ''
      var parts = []
      for (i=0, len=match.length; i<len; i+=4) {
        parts.push(match.substring(i, i+4))
      }
      if (parts.length) {
        return parts.join(' ')
      } else {
        return value
      }
    }
    
    onload = function() {
      document.getElementById('cc').oninput = function() {
        this.value = cc_format(this.value)
      }
    }
    function checkDigit(event) {
        var code = (event.which) ? event.which : event.keyCode;
    
        if ((code < 48 || code > 57) && (code > 31)) {
            return false;
        }
    
        return true;
    }
    <form>
      <input id="cc" value="" placeholder="1234 1234 1234 1234" onkeypress="return checkDigit(event)">
    </form>

    Live demo of check digit and formatting of CC card number

    0 讨论(0)
  • 2020-12-08 12:19
    <?php
    
    
    function luhn_check($number) {
    
      // Strip any non-digits (useful for credit card numbers with spaces and hyphens)
      $number=preg_replace('/\D/', '', $number);
    
      // Set the string length and parity
      $number_length=strlen($number);
      $parity=$number_length % 2;
    
      // Loop through each digit and do the maths
      $total=0;
      for ($i=0; $i<$number_length; $i++) {
        $digit=$number[$i];
        // Multiply alternate digits by two
        if ($i % 2 == $parity) {
          $digit*=2;
          // If the sum is two digits, add them together (in effect)
          if ($digit > 9) {
            $digit-=9;
          }
        }
        // Total up the digits
        $total+=$digit;
      }
    
      // If the total mod 10 equals 0, the number is valid
      return ($total % 10 == 0) ? TRUE : FALSE;
    
    }
    ?>
    
    0 讨论(0)
提交回复
热议问题