我想在文本框中输入小数点。我想通过在小数点后输入2位以上来限制用户。我已经在Keypress活动中编写了实现该代码的代码。
function validateFloatKeyPress(el, evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
if (charCode == 46 && el.value.indexOf(".") !== -1) {
return false;
}
if (el.value.indexOf(".") !== -1)
{
var range = document.selection.createRange();
if (range.text != ""){
}
else
{
var number = el.value.split('.');
if (number.length == 2 && number[1].length > 1)
return false;
}
}
return true;
}
<asp:TextBox ID="txtTeamSizeCount" runat="server" onkeypress="return validateFloatKeyPress(this,event);" Width="100px" MaxLength="6"></asp:TextBox>
代码正在运作,但问题是:如果我输入“。75”然后将其更改为“1.75”,则无法实现。唯一的方法是完全删除它,然后键入“1.75”。如果文本框中的小数点后面已有2位数,则会出现此问题。我施加的条件是
a)小数存在后,它必须至少有1或2位数。对于ex .75或.7或10.75或333.55或333.2 被接受。但不是 .753或12.3335
b)在小数点之前,用户输入值不是必须的。用户还必须能够输入整数。
你能告诉我这可能是什么问题吗?
谢谢,
Jollyguy
答案 0 :(得分:29)
你快到了。只需检查小数点后不超过2个字符。
更新1 - 检查克拉位置以允许在小数点前插入字符 更新2 - 正确的问题由ddlab的评论指出,只允许一个点。
function validateFloatKeyPress(el, evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
var number = el.value.split('.');
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
//just one dot (thanks ddlab)
if(number.length>1 && charCode == 46){
return false;
}
//get the carat position
var caratPos = getSelectionStart(el);
var dotPos = el.value.indexOf(".");
if( caratPos > dotPos && dotPos>-1 && (number[1].length > 1)){
return false;
}
return true;
}
//thanks: http://javascript.nwbox.com/cursor_position/
function getSelectionStart(o) {
if (o.createTextRange) {
var r = document.selection.createRange().duplicate()
r.moveEnd('character', o.value.length)
if (r.text == '') return o.value.length
return o.value.lastIndexOf(r.text)
} else return o.selectionStart
}
<击> http://jsfiddle.net/S9G8C/1/ 击>
http://jsfiddle.net/S9G8C/203/
答案 1 :(得分:9)
考虑利用HTML5的Constraint Validation API。它不一定会阻止键入无效值,但该字段标记为无效,并且暂停提交<form>
(默认情况下)。我添加了<output>
来说明浏览器考虑的原因,例如: “1.100”一个有效值(它将数值视为“1.1”)。
<input id="n" type="number" step=".01">
var
n = document.getElementById('n'),
o = document.getElementById('o'),
didInputN = function(e) {
o.value = n.valueAsNumber;
};
n.addEventListener('input', didInputN);
input:invalid {
color: white;
background-color: red;
}
<input id="n" type="number" step=".01">
<output id="o" for="n"></output>
从哲学上讲,您可能会认为这是一种更有用的方法,因为它允许用户粘贴无效条目并直接在字段中进行编辑。
答案 2 :(得分:7)
你可以通过onchange事件采用另一种方式,不限制用户输入,而只是在输入后转换数字,制作统一,如下所示,
function validateFloatKeyPress(el) {
var v = parseFloat(el.value);
el.value = (isNaN(v)) ? '' : v.toFixed(2);
}
<input id="aninput" type="text" onchange="validateFloatKeyPress(this);" />
45.846
应为45.85
,但在您的代码中,用户需要转换他们自己,然后他们会直接输入45.85
答案 3 :(得分:2)
function decimalValidation(el, evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
var number = el.value.split('.');
if(charCode == 8) {
return true;
}
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
//just one dot
if(number.length>1 && charCode == 46){
return false;
}
//get the carat position
var caratPos = getSelectionStart(el);
var dotPos = el.value.indexOf(".");
if( caratPos > dotPos && dotPos>-1 && (number[1].length > 1)){
return false;
}
return true;
}
function getSelectionStart(o) {
return o.selectionStart
}
您好@webvitaly以上代码也适用于IE,请检查 并且在小数点后退格不能在Mozilla中工作我更新了我的答案。
答案 4 :(得分:0)
这段代码很简单,我改变了#34;。&#34;到&#34;,&#34;:
无法写更多&#34;,&#34;
<script type="text/javascript">
function isNumberKey(evt, el) {
var charCode = (evt.which) ? evt.which : event.keyCode;
var number = el.value.split(',');
var caracter = el.value;
if (charCode != 44 && charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
if (charCode == 44 && caracter == "") {
return false;
}
if (charCode == 44 && caracter.indexOf(",") != -1) {
return false;
}
//get the carat position
var caratPos = getSelectionStart(el);
var dotPos = el.value.indexOf(",");
if (caratPos > dotPos && dotPos > -1 && (number[1].length > 1)) {
return false;
}
return true;
}
function getSelectionStart(o) {
if (o.createTextRange) {
var r = document.selection.createRange().duplicate()
r.moveEnd('character', o.value.length)
if (r.text == '') return o.value.length
return o.value.lastIndexOf(r.text)
} else return o.selectionStart
}
</script>
答案 5 :(得分:0)
1.)No multiple decimals points.
2.)Two numbers after decimal point.
3.)Allow only Numbers and one decimal point(.).
这会有所帮助。jsFiddle
答案 6 :(得分:0)
我的问题是,如果只允许用户使用2位小数,我需要它实时显示错误消息:
value = parseFloat(valueFromInput);
parseFloat(value.toFixed(2)) !== value // condition to check
上面的代码对我有用。.toFixed
将浮点数转换为只有2个小数的字符串,我必须转换回浮点数以检查初始值是否相同。
P.S。在此情况之前,您应该检查该值是否为NaN。