我在键向上事件中使用了以下代码来分隔千和小数。但是输入 15 位数字后,值得到 0。会是什么原因??
<script>
var myinput = document.getElementById('myinput');
myinput.addEventListener('keyup', function() {
var val = this.value;
val = val.replace(/[^0-9.]/g,'');
if(val != "") {
valArr = val.split('.');
valArr[0] = (parseInt(valArr[0],10)).toLocaleString();
val = valArr.join('.');
}
this.value = val;
});
</script>
<input id="myinput" type="text'>
问题:
这里的问题是,当parseInt()
尝试解析输入string
值时,您达到了Number
的最大可能值,请检查Number.MAX_SAFE_INTEGERMDN 参考以获取更多详细信息。
因此,当数字超过 Number.MAX_SAFE_INTEGER 时,您输入的所有额外数字都将被忽略并转换为 0。请查看在JavaScript 中使用大整数教程以获取更多解释和示例。
因此,您不能将较大的number
值视为 Javsacript 中的Number
,因为存在最大可能值限制,您需要将其视为string
,因此它可以超过此最大value
。
溶液:
此处的解决方案是将此number
视为string
,并使用Regex
和.replace()
方法来更改其格式。
这是我之前写过的解决方案,我总是用它来格式化数字,它将解决您的问题:
var formatNumber = function(input, fractionSeparator, thousandsSeparator, fractionSize) {
fractionSeparator = fractionSeparator || '.';
thousandsSeparator = thousandsSeparator || ',';
fractionSize = fractionSize || 3;
var output = '',
parts = [];
input = input.toString();
parts = input.split(".");
output = parts[0].replace(/B(?=(d{3})+(?!d))/g, thousandsSeparator).trim();
if (parts.length > 1) {
output += fractionSeparator;
output += parts[1].substring(0, fractionSize);
}
return output;
};
演示:
这是原始代码的工作小提琴。