我想要在我的输入框中加入千位分隔符(例如1,000,000)。然而,它必须是“数字”类型,因为我需要能够使用“步骤”调整其值。代码:
<input type="number" id='myNumber' value="40,000" step='100'>
我尝试使用JavaScript来调整值,但没有成功。希望得到帮助。谢谢!
我想要在我的输入框中加入千位分隔符(例如1,000,000)。然而,它必须是“数字”类型,因为我需要能够使用“步骤”调整其值。代码:
<input type="number" id='myNumber' value="40,000" step='100'>
我尝试使用JavaScript来调整值,但没有成功。希望得到帮助。谢谢!
Final result is summarized here (look at direct Codepen playground)
$("#formInput".on("keyup", function(event ) {
// When user select text in the document, also abort.
var selection = window.getSelection().toString();
if (selection !== '') {
return;
}
// When the arrow keys are pressed, abort.
if ($.inArray(event.keyCode, [38, 40, 37, 39]) !== -1) {
return;
}
var $this = $(this);
// Get the value.
var input = $this.val();
input = input.replace(/[\D\s\._\-]+/g, "");
input = input?parseInt(input, 10):0;
$this.val(function () {
return (input === 0)?"":input.toLocaleString("en-US");
});
});
注意:
在控制台中运行下面的代码,可以更好地理解:
(30000000).toLocaleString('en-US',{useGrouping:true})
<script src="~/Scripts/autoNumeric/autoNumeric.min.js" type="text/javascript"></script>
HTML:
<input type="text" id="DEMO" data-a-sign="" data-a-dec="," data-a-sep="." class="form-control">
脚本:
<script>
jQuery(function($) {
$('#DEMO').autoNumeric('init');
});
</script>
unformatOnSubmit:true
使用。然而,在我的实现中,我使用了某种确认窗口来阻止提交一段时间,因此我尚未直接测试过提交功能。 - SaidbakR$("input.mask").each((i,ele)=>{
let clone=$(ele).clone(false)
clone.attr("type","text")
let ele1=$(ele)
clone.val(Number(ele1.val()).toLocaleString("en"))
$(ele).after(clone)
$(ele).hide()
clone.mouseenter(()=>{
ele1.show()
clone.hide()
})
setInterval(()=>{
let newv=Number(ele1.val()).toLocaleString("en")
if(clone.val()!=newv){
clone.val(newv)
}
},10)
$(ele).mouseleave(()=>{
$(clone).show()
$(ele1).hide()
})
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input class="mask" type="number" value="12345.678"/>
clone.mouseenter
更改为 clone.focus
,则可能可以解决问题 b 和 c。 - amphetamachine在修改https://dev59.com/_lwZ5IYBdhLWcg3wFM3D#70726755后,我成功地实现了以下功能:
Number()
,代码实际上并没有添加逗号。onfocus
和onblur
。因此,这是一个修订后的答案:
<input type="text">
开始。您仍然可以添加min
、max
和step
属性。onfocus
和onblur
处理程序添加到<input>
节点中:function use_number(node) {
var empty_val = false;
const value = node.value;
if (node.value == '')
empty_val = true;
node.type = 'number';
if (!empty_val)
node.value = Number(value.replace(/,/g, '')); // or equivalent per locale
}
function use_text(node) {
var empty_val = false;
const value = Number(node.value);
if (node.value == '')
empty_val = true;
node.type = 'text';
if (!empty_val)
node.value = value.toLocaleString('en'); // or other formatting
}
<input type="text" min=0 onfocus="use_number(this)" onblur="use_text(this)">
div[comma-value]{
position:relative;
}
div[comma-value]:before{
content: attr(comma-value);
position:absolute;
left:0;
}
div[comma-value] input{
color:#fff;
}
需要一个包装 div,因为输入框不能有伪元素。
<div>
<input type="number" id='myNumber' value="40000" step='100'>
</div>
再加上一点JavaScript代码,每三个字符插入一个逗号
myNumber.value = commify(myNumber.value)
myNumber.addEventListener("change", function(){
commify(event.target.value)
})
function commify(value){
var chars = value.split("").reverse()
var withCommas = []
for(var i = 1; i <= chars.length; i++ ){
withCommas.push(chars[i-1])
if(i%3==0 && i != chars.length ){
withCommas.push(",")
}
}
var val = withCommas.reverse().join("")
myNumber.parentNode.setAttribute("comma-value",val)
}
查看fiddle示例。
csq 建议使用 jQuery autoNumeric 插件。我发现它非常易于使用。
我唯一的不满是它强制使用 <input type="text">
而不是 <input type="number">
。这意味着您会失去 step
的功能,但您可以让用户在字段中使用逗号。
我想你可以将期望值小于1,000的设置为 <input type="number">
,而大于1,000的设置为 <input type="text">
function addCommas(nStr) { ....
除了yovanny的答案外,我还创建了一个使用这个函数的Vue组件。
Vue.component("in-n", {
template:
`<input @keyup="keyup" @keypress="isNumber($event)" v-model="text" type="text" />`,
props: ["value"],
data() {
return {
text: ""
}
},
methods: {
addCommas(nStr) {
nStr += '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? ',' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
},
isNumber: function (evt) {
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
evt.preventDefault();;
} else {
return true;
}
},
keyup() {
this.text = this.addCommas(this.text.replace(/,/g, ''));
this.$emit("input", parseInt(this.text.replace(/,/g, '')))
}
}
})
我已经更新了@CollenZhou的回答https://dev59.com/_lwZ5IYBdhLWcg3wFM3D#67295023 ,因为鼠标离开时,输入框会失去焦点,这是很烦人的。我还将所有输入类型数字添加到选择器和类中。
$('input.thousands-separator, input[type="number"]').each((i,ele)=>{
let clone=$(ele).clone(false)
clone.attr('type','text')
let ele1=$(ele)
clone.val(Number(ele1.val()).toLocaleString('en'))
$(ele).after(clone)
$(ele).hide()
clone.mouseenter(()=>{
ele1.show()
clone.hide()
})
setInterval(()=>{
let newv=Number(ele1.val()).toLocaleString('en')
if(clone.val()!=newv){
clone.val(newv)
}
},10)
$(ele).mouseleave((event)=>{
if ($(ele).is(':focus')) {
event.preventDefault();
} else {
$(clone).show()
$(ele1).hide()
}
})
$(ele).focusout(()=>{
$(clone).show()
$(ele1).hide()
})
})
我找到了一个更简单的答案:
<input type="text">
开始。您仍然可以添加 min、max 和 step 属性。<input>
节点中:node.addEventListener('onfocus', () => {
const value = node.value;
node.type = 'number';
node.value = Number(value.replace(/,/g, '')); // or equivalent per locale
});
node.addEventListener('onblur', () => {
const value = node.value;
node.type = 'text';
node.value = value.toLocaleString(); // or other formatting
});
尝试
function addCommas(nStr)
{
nStr += '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? ',' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
}
parseFloat()
无法解析该值,则“数字”输入字段将无法正常工作。 - Pointy