javascript格式编号

javascript格式编号,javascript,regex,Javascript,Regex,在正则表达式中完全是noob 我想将像:1234123423412341234这样的数字格式化为: 1234123412341234 目前我有以下代码: <label for="num1">Formmatted Number</label> <input id="num1" type="text" name="num1" /> function space(str, after) { if (!str) { return false;

在正则表达式中完全是noob

我想将像:1234123423412341234这样的数字格式化为:

1234123412341234

目前我有以下代码:

<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);
});
Formmatted Number
函数空间(str,after){
如果(!str){
返回false;
}
after=在| | 4之后;
var v=str.replace(/[^\dA-Z]/g',),
reg=新的RegExp(“.{”+“}”之后的“.{”+”,“g”);
返回v.replace(注册,功能(a){
返回一个+'';
});
}
var el=document.getElementById('num1');
el.addEventListener('keyup',函数(){
this.value=空间(this.value,4);
});
这将数字的格式设置为:

1234 1234 1234 1234 1234


你能帮我一下吗?

这里有一个不使用正则表达式的解决方案

const fmtNum=(num)=>[2,7,12,17]。reduce((acc,curr)=>[acc.slice(0,curr),“”,acc.slice(curr)]。连接(“”,字符串(num))

请注意,为了实现这一点,我们必须将类型从number更改为string

这可以扩展为传入一个包含不同打断索引的参数,您可以在其中指定空间的位置,如:

const fmtNum=(num,spacePoints)=>spacePoints.reduce((acc,curr)=>[acc.slice(0,curr),“”,acc.slice(curr)]。连接(“”,字符串(num))

调用此函数将类似于:
fmtNum(12341234112341234[2,7,12,17])
刚刚解决了这个问题:)。。。无论如何,谢谢你的帮助。正如前面的主题所讨论的,16的长度并不重要,因为该字段只允许插入16个字符。。。否则,该约束可以包含在脚本中

函数格式(str,after){
var v=str.replace(/[^\dA-Z]/g',),
reg=新的RegExp(“.{”+“}”之后的“.{”+”,“g”);
返回v.replace(注册,功能(a){
如果(a.长度>2){
a=a.子串(0,2)+''+a.子串(2,a.长度);
}
返回a;
});
}
var el=document.getElementById('num1');
el.addEventListener('keyup',函数(){
this.value=格式(this.value,4);
});
格式化数字
试试这种模式:
\b(\d{2})(\d{4})(\d{4})(\d{4})(\d{2})\b
,它允许您将数字的分词器批次放入单独的组中,然后将其替换为
\1\2\3\4\5
,这将为您提供所需的格式


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

var number=12341234112341234,
string=number.toString().replace(/^…|…../g,'$&');

console.log(字符串)这是一种逐步格式化输入的简洁方法。这甚至可以在插入或删除字符串中间的字符时将当前光标位置保持在正确的位置:

函数计数(str,re){
返回str.split(re).长度-1
}
document.querySelector('input')。addEventListener('input',function(){
const{value,selectionStart}=此
const oldIndex=selectionStart-count(value.slice(0,selectionStart),/\D/g)
常量数值=值。替换(/\D/g“”)
常数已清除=数值
。替换(/(\d{0,2})(\d{0,4})(\d{0,4})(\d{0,4})(\d{0,2})。*/,“$1$2$3$4$5”)
.trim()
const newIndex=旧索引+数学楼层((旧索引+2)/4)
this.value=已消毒
此.setSelectionRange(newIndex,newIndex)
})

如果始终为16个字符,则如果索引等于2或索引是第4个字符,则可以使用带条件的map fn。

数字是否始终为相同长度?具体的格式化规则是什么?是2,4,4,4…的一组,剩菜吗?或者(剩菜),4,4,4…,2?或者其他什么?就长度而言,它应该始终是16,如示例中所示。数字的格式应始终为:XX XXXX XXXX XXXX XXXX XXXX如果用户输入的不是16位数字,您希望发生什么?我正在替换字符。。。现在长度并不重要。。。只是格式:)这是一个很酷的问题解决方案。。。如果要在键入完整字符串后执行:)。在这种情况下,我需要在用户输入数字时正确格式化字符串。。。这就是为什么我使用keyup event:)我相信我的解决方案仍然可以解决您的问题,如果您现在在事件处理程序中调用
space()
的同一位置调用该函数。它适用于部分字符串。格式化预定义字符串的好模式!谢谢,这确实是一个很好的解决方案!它结合了@MichałTurczyn的回复
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("");
}