JavaScript格式编号

时间:2018-08-09 15:43:04

标签: javascript regex

在正则表达式中完全没有菜...

我想使用类似以下格式的数字:1234123412341234

12 3412 3412 3412 34

当前我有以下代码:

<label for="num1">Formmatted Number</label>
<input id="num1" type="text" name="num1" />

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('num1');
el.addEventListener('keyup', function () {
    this.value = space(this.value, 4);
});

这会将数字设置为:

1234 1234 1234 1234

您能帮我吗?

6 个答案:

答案 0 :(得分:1)

这是不使用正则表达式的解决方案...

const fmtNum = (num) => [2, 7, 12, 17].reduce((acc, curr) => [acc.slice(0, curr), " ", acc.slice(curr)].join(""), String(num));

请注意,要完成此操作,我们必须将类型从数字更改为字符串。

这可以扩展为传入不同中断索引的参数,您可以在其中指定所需的空格,例如:

const fmtNum = (num, spacePoints) => spacePoints.reduce((acc, curr) => [acc.slice(0, curr), " ", acc.slice(curr)].join(""), String(num));

调用此方法看起来像: fmtNum(1234123412341234, [2, 7, 12, 17])

答案 1 :(得分:1)

您可以替换为2个起始数字,然后为所有四个数字添加一个空格。

var number = 1234123412341234,
    string = number.toString().replace(/^..|..../g, '$& ');
    
console.log(string);

或者您可以使用正向超前的正则表达式,以特殊的长度到字符串末尾。

var number = 1234123412341234,
    string = number.toString().replace(/(?=(.{14}|.{10}|.{6}|.{2})$)/g, ' ');
    
console.log(string);

答案 2 :(得分:1)

这是一种逐步格式化输入的巧妙方法。从字符串中间插入或删除字符时,这甚至可以将当前光标位置保持在正确的位置:

function count (str, re) {
  return str.split(re).length - 1
}

document.querySelector('input').addEventListener('input', function () {
  const { value, selectionStart } = this
  const oldIndex = selectionStart - count(value.slice(0, selectionStart), /\D/g)
  const numeric = value.replace(/\D/g, '')
  const sanitized = numeric
    .replace(/(\d{0,2})(\d{0,4})(\d{0,4})(\d{0,4})(\d{0,2}).*/, '$1 $2 $3 $4 $5')
    .trim()
  const newIndex = oldIndex + Math.floor((oldIndex + 2) / 4)

  this.value = sanitized
  this.setSelectionRange(newIndex, newIndex)
})
<input type="text">

答案 3 :(得分:0)

只需解决问题:)...无论如何,谢谢您的帮助。正如前面的主题所讨论的,长度的16位并不重要,因为该字段仅允许插入16个字符...否则该约束可以包含在脚本中。

function format(str, after) {
    var v = str.replace(/[^\dA-Z]/g, ''),
        reg = new RegExp(".{" + after + "}", "g");
    return v.replace(reg, function (a) {
        if (a.length > 2) {
            a = a.substring(0,2) + ' ' + a.substring(2,a.length);
        }
        return a;
    });
}

var el = document.getElementById('num1');
el.addEventListener('keyup', function () {
    this.value = format(this.value, 4);
});
<label for="num1">Formatted Number</label>
<input id="num1" type="text" name="num1" />

答案 4 :(得分:0)

尝试以下模式:\b(\d{2})(\d{4})(\d{4})(\d{4})(\d{2})\b,它将允许您将更具体的数字批次放入单独的组中,然后仅用\1 \2 \3 \4 \5进行替换,即可获得所需的格式。

Demo

答案 5 :(得分:-1)

var el = document.getElementById('num1'); 
el.addEventListener('keyup', function () { this.value = format(this.value); }); 

function format(s){ 
    return  Array.prototype.map.call(s,(e,i)=>(e=e.replace(/\s/g,""), 
        (i+3)%5==0 ? " "+e:e)).join("");
}

如果始终为16个字符,则可以将map fn与条件一起使用,条件是index等于2或index是第4个字符。