How to insert space every 4 characters for IBAN registering?

前端 未结 9 1712
感情败类
感情败类 2020-11-29 03:28

I\'m really new in JavaScript and I would like to add to my input text, space insertion for IBAN account registering.

相关标签:
9条回答
  • 2020-11-29 03:52

    Using plain-JavaScript, I'd suggest:

    function space(el, after) {
        // defaults to a space after 4 characters:
        after = after || 4;
    
        /* removes all characters in the value that aren't a number,
           or in the range from A to Z (uppercase): */
        var v = el.value.replace(/[^\dA-Z]/g, ''),
        /* creating the regular expression, to allow for the 'after' variable
           to be used/changed: */
            reg = new RegExp(".{" + after + "}","g")
        el.value = v.replace(reg, function (a, b, c) {
            return a + ' ';
        });
    }
    
    var el = document.getElementById('iban');
    el.addEventListener('keyup', function () {
        space(this, 4);
    });
    

    JS Fiddle demo.

    Somewhat belatedly, my rewrite of the above to handle strings, rather than DOM nodes:

    function space(str, after) {
        if (!str) {
            return false;
        }
        after = after || 4;
        var v = str.replace(/[^\dA-Z]/g, ''),
            reg = new RegExp(".{" + after + "}", "g");
        return v.replace(reg, function (a) {
            return a + ' ';
        });
    }
    
    var el = document.getElementById('iban');
    el.addEventListener('keyup', function () {
        this.value = space(this.value, 4);
    });
    

    JS Fiddle demo.

    References:

    • addEventListener().
    • JavaScript regular expressions.
    0 讨论(0)
  • 2020-11-29 03:52

    for thousands on angular 4 in a pipe integer = integer.replace(/[^\dA-Z]/g, '').replace(/(.{3})/g, '$1.').trim();

    0 讨论(0)
  • 2020-11-29 03:53
    onChangeText={number => {
     const data =
      number.length % 5 !== 4
        ? number
            .replace(/[^\dA-Z]/g, '')
            .replace(/(.{4})/g, '$1-')
            .trim()
        : number;
     this.setState({
      ...this.state,
      card: {...this.state.card, number: data},
     });
    }}
    

    If you are trying to use for text input to adjust with credit card then this method will help you solve the backspace problem too

    0 讨论(0)
  • 2020-11-29 03:58

    The existing answers are relatively long, and they look like over-kill. Plus they don't work completely (for instance, one issue is that you can't edit previous characters).

    For those interested, according to Wikipedia:

    Permitted IBAN characters are the digits 0 to 9 and the 26 upper-case Latin alphabetic characters A to Z.

    Here is a relatively short version that is similar to the existing answers:

    document.getElementById('iban').addEventListener('input', function (e) {
      e.target.value = e.target.value.replace(/[^\dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
    });
    <label for="iban">iban</label>
    <input id="iban" type="text" name="iban" />


    As stated above, the caveat is that you can't go back and edit previous characters. If you want to fix this, you would need to retrieve the caret's current position by initially accessing the selectionEnd property and then setting the caret's position after the regex formatting has been applied.

    document.getElementById('iban').addEventListener('input', function (e) {
      var target = e.target, position = target.selectionEnd, length = target.value.length;
      
      target.value = target.value.replace(/[^\dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
      target.selectionEnd = position += ((target.value.charAt(position - 1) === ' ' && target.value.charAt(length - 1) === ' ' && length !== target.value.length) ? 1 : 0);
    });
    <label for="iban">iban</label>
    <input id="iban" type="text" name="iban" />

    You will notice that there is a slight issue when the character after the caret is a space (because the space wasn't accounted for when initially retrieving the caret's position to begin with). To fix this, the position is manually incremented if the succeeding character is a space (assuming a space was actually added - which is determined by comparing the length before and after replacing the characters).

    0 讨论(0)
  • 2020-11-29 03:59

    I need the same but for BVR/BVR+ swiss payment form. So what I need is add a space every 5 chars but from the end of the string.

    Example : "52 86571 22001 00000 10520 15992" or sometimes shorter like "843 14293 10520 15992".

    So, here is the solution by reversing the string before and after adding spaces if rev=1.

    function space(str, stp, rev) {
        if (!str) {
            return false;
        }
        if (rev == 1) {
            str = str.split('').reverse().join('');
        }
        if(stp > 0) {
            var v = str.replace(/[^\dA-Z]/g, ''),
                reg = new RegExp(".{" + stp + "}", "g");
            str = v.replace(reg, function (a) {
                return a + ' ';
            });
        }
        if (rev == 1) {
            str = str.split('').reverse().join('');
        }
        return str;
    }
    

    Use :

    var refTxt = space(refNum, 5, 1);
    

    EDIT : PHP version added

    function space($str=false, $stp=0, $rev= false) {
    
        if(!$str)
            return false;
        
        if($rev)
            return trim(strrev(chunk_split(strrev($str), $stp, ' ')));
        else
            return trim(chunk_split($str, $stp, ' '));
    }
    
    0 讨论(0)
  • 2020-11-29 04:04

    You have to capture each group of 4 digits and then put a space between each group.

      $('input').blur(function () {
      //Replace each group 4 digits  with a group plus a space
            var reformat = this.value.replace(/(\d{4})/g, function(match){
            return match + " ";
            });
            this.value = reformat;
        })
    

    And this one updates the element while typing

     //Keys pressed 0 times
    var downed = 0; 
    $('#test').keydown(function (g) {
        if(g.code.match("^Digit")){
            downed++;
          console.log(g)
        }
    
        if(downed == 1){
            var reformat = this.value.replace(/(\d{4}\s*)/g, function(match){
                //Strip spaces
                if(match.match(/\s/)){return match;}
                return match + " ";
        });
        console.log(reformat);
        this.value = reformat; 
        //Start recount
            downed = 0;
        }
    });
    

    Check out the fiddle

    0 讨论(0)
提交回复
热议问题