我有一个输入框,用户输入社会安全号码(SSN)。在输入时,应自动进行格式化。例如,在textField更改时,应以这种方式
999-999-999
格式化并在显示本身上显示。999-999-999
格式化并在显示本身上显示。@kottenator的脚本几乎达到了要求,但是它每三个数字就断开一次值,而不是像社会保障号码所需的000-00-0000那样每三个数字后再断开两个数字。
我进行了一些编辑,并修改它以按照预期工作。希望这可以帮到您。
<script type="text/javascript">
$('#ssn1').keyup(function() {
var val = this.value.replace(/\D/g, '');
var newVal = '';
if(val.length > 4) {
this.value = val;
}
if((val.length > 3) && (val.length < 6)) {
newVal += val.substr(0, 3) + '-';
val = val.substr(3);
}
if (val.length > 5) {
newVal += val.substr(0, 3) + '-';
newVal += val.substr(3, 2) + '-';
val = val.substr(5);
}
newVal += val;
this.value = newVal.substring(0, 11);
});
</script>
<input id="ssn"/>
<script type="text/javascript">
$('#ssn').keyup(function() {
var val = this.value.replace(/\D/g, '');
val = val.replace(/^(\d{3})/, '$1-');
val = val.replace(/-(\d{2})/, '-$1-');
val = val.replace(/(\d)-(\d{4}).*/, '$1-$2');
this.value = val;
});
</script>
000-00-0000
格式的。 - ca9163d9NNN-NN-NNNN
模式。 - Rost@Dennisçš„ç”案是最好的,但它使用了JQuery选择器,而OP在æ¤å¸–å�上没有使用JQueryæ ‡ç¾ï¼Œå�ªæœ‰JavaScript。这里是解决方案的VanillaJS版本(或至少一ç§�方法🙂)
document.getElementById("ssn").onkeyup = function() {
var val = this.value.replace(/\D/g, '');
var newVal = '';
if(val.length > 4) {
this.value = val;
}
if((val.length > 3) && (val.length < 6)) {
newVal += val.substr(0, 3) + '-';
val = val.substr(3);
}
if (val.length > 5) {
newVal += val.substr(0, 3) + '-';
newVal += val.substr(3, 2) + '-';
val = val.substr(5);
}
newVal += val;
this.value = newVal;
};
<input id="ssn"/>
<script type="text/javascript">
$( "#ssn" ).on("input", function() {
var val = this.value.replace(/\D/g, '');
val = val.replace(/^(\d{3})(\d{1,2})/, '$1-$2');
val = val.replace(/^(\d{3})-(\d{2})(.+)/, '$1-$2-$3');
this.value = val.substring(0, 11);
});
</script>
我认为不是所有版本的浏览器都支持input
事件。您可以改用keyup
事件,但我找不到有关多少浏览器支持它的信息。如果使用键盘事件,则可能会遇到问题#2,但这可能没有关系。一些用户可能会发现这很有帮助,以便知道他们做错了什么。
formattedValue.length === 3 ?
${formattedValue}- : formattedValue;
<br>
但是,这实际上会在退格时引起问题,使得无法删除破折号。 - Nate Thompson/[^0-9-]/g
的内容,第6行中的正则表达式为类似/^(\d{3})-*(\d{1,2})/
的内容,第7行中的正则表达式为/^(\d{3})-(\d{2})-*(\d{1,4})/
。请不要引用我的话。老实说,这里有很多可以改进的地方。 - knodfunction formatSSN(ssn) {
// remove all non-dash and non-numerals
var val = ssn.replace(/[^\d-]/g, '');
// add the first dash if number from the second group appear
val = val.replace(/^(\d{3})-?(\d{1,2})/, '$1-$2');
// add the second dash if numbers from the third group appear
val = val.replace(/^(\d{3})-?(\d{2})-?(\d{1,4})/, '$1-$2-$3');
// remove misplaced dashes
val = val.split('').filter((val, idx) => {
return val !== '-' || idx === 3 || idx === 6;
}).join('');
// enforce max length
return val.substring(0, 11);
}
// bind our function
document.getElementById("ssn").onkeyup = function(e) {
this.value = formatSSN(this.value);
}
$('#ssn').keyup(function() {
var val = this.value.replace(/\D/g, '');
var newVal = '';
var sizes = [3, 2, 4];
for (var i in sizes) {
if (val.length > sizes[i]) {
newVal += val.substr(0, sizes[i]) + '-';
val = val.substr(sizes[i]);
}
else
break;
}
newVal += val;
this.value = newVal;
});
$.usernameField.addEventListener('blur', function(param) {
var inputString = param.value;
if (inputString.length === 9 && _.isNumber(parseInt(inputString, 10))) {
var val = inputString.replace(/\D/g, '');
var outputString = '';
outputString += val.substr(0, 3) + '-';
outputString += val.substr(3, 2) + '-';
val = val.substr(5);
outputString += val;
$.usernameField.value = outputString;
}
});
试试这个:
try {
this.value = this.value.replace(/\D/g, '').match(/(\d{1,3})(\d{1,2})?(\d{1,4})?/).slice(1, 4).filter(el=>!!el).join('-'));
}catch{}
\d{3}-\d{3}-\d{3}
,但这是问题中要求的方式。由于某种原因,我忘记了 SSN 有多少个字符。感谢 @Dennis O'Neil / @Jason Hansen。 - Rost