javascript - saber - solo numeros angular 4
Restringir entrada al cuadro de texto: permitiendo solo nĂºmeros y punto decimal (30)
¿Estás buscando algo así?
<HTML>
<HEAD>
<SCRIPT language=Javascript>
<!--
function isNumberKey(evt)
{
var charCode = (evt.which) ? evt.which : event.keyCode
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<INPUT id="txtChar" onkeypress="return isNumberKey(event)" type="text" name="txtChar">
</BODY>
</HTML>
¿Cómo puedo restringir la entrada a un cuadro de texto para que solo acepte números y el punto decimal?
A partir de @rebisco respuesta:
function count_appearance(mainStr, searchFor) {
return (mainStr.split(searchFor).length - 1);
}
function isNumberKey(evt)
{
$return = true;
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode != 46 && charCode > 31
&& (charCode < 48 || charCode > 57))
$return = false;
$val = $(evt.originalTarget).val();
if (charCode == 46) {
if (count_appearance($val, ''.'') > 0) {
$return = false;
}
if ($val.length == 0) {
$return = false;
}
}
return $return;
}
Solo permite este formato: 123123123 [.121213]
Demo aquí demo
Aquí hay una solución más que permite números decimales y también limita los dígitos después de decimal a 2 decimales.
function isNumberKey(evt, element) {
var charCode = (evt.which) ? evt.which : event.keyCode
if (charCode > 31 && (charCode < 48 || charCode > 57) && !(charCode == 46 || charCode == 8))
return false;
else {
var len = $(element).val().length;
var index = $(element).val().indexOf(''.'');
if (index > 0 && charCode == 46) {
return false;
}
if (index > 0) {
var CharAfterdot = (len + 1) - index;
if (CharAfterdot > 3) {
return false;
}
}
}
return true;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" id="rate" placeholder="Billing Rate" required onkeypress="return isNumberKey(event,this)">
El siguiente código funcionó para mí
El cuadro de entrada con el evento "onkeypress" de la siguiente manera
<input type="text" onkeypress="return isNumberKey(this,event);" />
La función "isNumberKey" es la siguiente
function isNumberKey(txt, evt) {
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode == 46) {
//Check if the text already contains the . character
if (txt.value.indexOf(''.'') === -1) {
return true;
} else {
return false;
}
} else {
if (charCode > 31 && (charCode < 48 || charCode > 57))
return false;
}
return true;
}
Espero que funcione para ti.
<input type="text" onkeypress="return chkNumeric(event)" />
<script>
function chkNumeric(evt) {
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
if (charCode == 46) { return true; }
else { return false; }
}
return true;
}
</script>
Extendiendo la respuesta de @ rebisco. este código a continuación permitirá solo números y solo ''.'' (período) en el cuadro de texto.
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
} else {
// If the number field already has . then don''t allow to enter . again.
if (evt.target.value.search(//./) > -1 && charCode == 46) {
return false;
}
return true;
}
}
La mejor solución de trabajo con muestra de Pure-JavaScript. Demostración en vivo: https://jsfiddle.net/manoj2010/ygkpa89o/
<script>
function removeCommas(nStr) {
if (nStr == null || nStr == "")
return "";
return nStr.toString().replace(/,/g, "");
}
function NumbersOnly(myfield, e, dec,neg)
{
if (isNaN(removeCommas(myfield.value)) && myfield.value != "-") {
return false;
}
var allowNegativeNumber = neg || false;
var key;
var keychar;
if (window.event)
key = window.event.keyCode;
else if (e)
key = e.which;
else
return true;
keychar = String.fromCharCode(key);
var srcEl = e.srcElement ? e.srcElement : e.target;
// control keys
if ((key == null) || (key == 0) || (key == 8) ||
(key == 9) || (key == 13) || (key == 27))
return true;
// numbers
else if ((("0123456789").indexOf(keychar) > -1))
return true;
// decimal point jump
else if (dec && (keychar == ".")) {
//myfield.form.elements[dec].focus();
return srcEl.value.indexOf(".") == -1;
}
//allow negative numbers
else if (allowNegativeNumber && (keychar == "-")) {
return (srcEl.value.length == 0 || srcEl.value == "0.00")
}
else
return false;
}
</script>
<input name="txtDiscountSum" type="text" onKeyPress="return NumbersOnly(this, event,true)" />
La solución aceptada no está completa, ya que puede ingresar múltiples ''.'', Por ejemplo 24 .... 22..22. con algunas modificaciones pequeñas funcionará según lo previsto:
<HTML><HEAD>
<script type="text/javascript">
function isNumberKey(txt, evt) {
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode == 46) {
//Check if the text already contains the . character
if (txt.value.indexOf(''.'') === -1) {
return true;
} else {
return false;
}
} else {
if (charCode > 31
&& (charCode < 48 || charCode > 57))
return false;
}
return true;
}
</SCRIPT></HEAD><BODY>
<input type="text" onkeypress="return isNumberKey(this, event);" /> </BODY></HTML>
Mejor solución
var checkfloats = function(event){
var charCode = (event.which) ? event.which : event.keyCode;
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57))
return false;
if(event.target.value.indexOf(''.'') >=0 && charCode == 46)
return false;
return true;
}
Observé que para todas las respuestas proporcionadas aquí, las cosas no funcionan si seleccionamos alguna parte del texto en el cuadro de texto e intentamos sobrescribir esa parte. Así que modifiqué la función, que es la siguiente:
<HTML>
<HEAD>
<SCRIPT language=Javascript>
<!--
function isNumberKey(evt)
{
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57))
{
return false;
}
if (charCode == 46 && evt.srcElement.value.split(''.'').length>1 )
{
return false;
}
if(evt.srcElement.selectionStart<evt.srcElement.selectionEnd)
{
return true;
}
if(evt.srcElement.value.split(''.'').length>1 && evt.srcElement.value.split(''.'')[1].length==2)
{
return false;
}
return true;
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<INPUT id="txtChar" onkeypress="return isNumberKey(event)"
type="text" name="txtChar">
</BODY>
</HTML>
Para cualquiera que tropiece aquí como yo, aquí hay una versión de jQuery 1.10.2 que escribí y que funciona muy bien para mí, aunque requiera muchos recursos:
/***************************************************
* Only allow numbers and one decimal in text boxes
***************************************************/
$(''body'').on(''keydown keyup keypress change blur focus paste'', ''input[type="text"]'', function(){
var target = $(this);
var prev_val = target.val();
setTimeout(function(){
var chars = target.val().split("");
var decimal_exist = false;
var remove_char = false;
$.each(chars, function(key, value){
switch(value){
case ''0'':
case ''1'':
case ''2'':
case ''3'':
case ''4'':
case ''5'':
case ''6'':
case ''7'':
case ''8'':
case ''9'':
case ''.'':
if(value === ''.''){
if(decimal_exist === false){
decimal_exist = true;
}
else{
remove_char = true;
chars[''''+key+''''] = '''';
}
}
break;
default:
remove_char = true;
chars[''''+key+''''] = '''';
break;
}
});
if(prev_val != target.val() && remove_char === true){
target.val(chars.join(''''))
}
}, 0);
});
Para números decimales y también permitir números negativos con 2 lugares para decimales después del punto ... Modifiqué la función a:
<input type="text" id="txtSample" onkeypress="return isNumberKey(event,this)"/>
function isNumberKey(evt, element){
var charCode = (evt.which) ? evt.which : event.keyCode
if (charCode > 31 && (charCode < 48 || charCode > 57) && !(charCode == 46 || charCode == 8 || charCode == 45))
return false;
else {
var len = $(element).val().length;
// Validation Point
var index = $(element).val().indexOf(''.'');
if ((index > 0 && charCode == 46) || len == 0 && charCode == 46) {
return false;
}
if (index > 0) {
var CharAfterdot = (len + 1) - index;
if (CharAfterdot > 3) {
return false;
}
}
// Validating Negative sign
index = $(element).val().indexOf(''-'');
if ((index > 0 && charCode == 45) || (len > 0 && charCode == 45)) {
return false;
}
}
return true;
}
Sé que esta pregunta es muy antigua, pero a menudo obtenemos esos requisitos. Hay muchos ejemplos, sin embargo, muchos parecen demasiado detallados o complejos para una simple implementación.
Consulte este https://jsfiddle.net/vibs2006/rn0fvxuk/ y mejore (si puede). Funciona en IE, Firefox, Chrome y Edge Browser.
Aquí está el código de trabajo.
function IsNumeric(e) {
var IsValidationSuccessful = false;
console.log(e.target.value);
document.getElementById("info").innerHTML = "You just typed ''''" + e.key + "''''";
//console.log("e.Key Value = "+e.key);
switch (e.key)
{
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9":
case "0":
case "Backspace":
IsValidationSuccessful = true;
break;
case "Decimal": //Numpad Decimal in Edge Browser
case ".": //Numpad Decimal in Chrome and Firefox
case "Del": // Internet Explorer 11 and less Numpad Decimal
if (e.target.value.indexOf(".") >= 1) //Checking if already Decimal exists
{
IsValidationSuccessful = false;
}
else
{
IsValidationSuccessful = true;
}
break;
default:
IsValidationSuccessful = false;
}
//debugger;
if(IsValidationSuccessful == false){
document.getElementById("error").style = "display:Block";
}else{
document.getElementById("error").style = "display:none";
}
return IsValidationSuccessful;
}
Numeric Value: <input type="number" id="text1" onkeypress="return IsNumeric(event);" ondrop="return false;" onpaste="return false;" /><br />
<span id="error" style="color: Red; display: none">* Input digits (0 - 9) and Decimals Only</span><br />
<div id="info"></div>
Si lo quieres para valores flotantes,
Aquí está la función que estoy usando
<HTML>
<HEAD>
<SCRIPT language=Javascript>
<!--
function check(e, value) {
//Check Charater
var unicode = e.charCode ? e.charCode : e.keyCode;
if (value.indexOf(".") != -1)
if (unicode == 46) return false;
if (unicode != 8)
if ((unicode < 48 || unicode > 57) && unicode != 46) return false;
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<INPUT id="txtChar" onkeypress="return check(event,value)" type="text" name="txtChar">
</BODY>
</HTML>
Solo necesita aplicar este método en Jquery y puede validar su cuadro de texto para solo aceptar el número con solo un decimal.
function IsFloatOnly(element) {
var value = $(element).val();
var regExp ="^//d+(//.//d+)?$";
return value.match(regExp);
}
Por favor, mira la demostración de trabajo here
Suponga que su nombre de campo de cuadro de texto es Income
Llame a este método de validación cuando necesite validar su campo:
function validate() {
var currency = document.getElementById("Income").value;
var pattern = /^[1-9]/d*(?:/./d{0,2})?$/ ;
if (pattern.test(currency)) {
alert("Currency is in valid format");
return true;
}
alert("Currency is not in valid format!Enter in 00.00 format");
return false;
}
Todas las soluciones presentadas aquí usan eventos de clave única. Esto es muy propenso a errores ya que la entrada también puede darse usando copy''n''paste o drag''n''drop. Además, algunas de las soluciones restringen el uso de teclas que no son de carácter como ctrl+c
, Pos1
, etc.
Sugiero que en lugar de verificar cada pulsación de tecla, compruebe si el resultado es válido con respecto a sus expectativas.
var validNumber = new RegExp(/^/d*/.?/d*$/);
var lastValid = document.getElementById("test1").value;
function validateNumber(elem) {
if (validNumber.test(elem.value)) {
lastValid = elem.value;
} else {
elem.value = lastValid;
}
}
<textarea id="test1" oninput="validateNumber(this);" ></textarea>
El evento de entrada se activa justo después de que se cambió algo en el área de texto y antes de que se procesara.
Puede extender el RegEx al formato de número que quiera aceptar. Esto es mucho más fácil de mantener y ampliable que la verificación de pulsaciones de una sola tecla.
Trabajando en el tema yo mismo, y eso es lo que tengo hasta ahora. Esto funciona más o menos, pero es imposible agregar menos después debido a la nueva comprobación de valor. Tampoco permite la coma como un separador de mil, solo decimal.
No es perfecto, pero podría dar algunas ideas.
app.directive(''isNumber'', function () {
return function (scope, elem, attrs) {
elem.bind(''keypress'', function (evt) {
var keyCode = (evt.which) ? evt.which : event.keyCode;
var testValue = (elem[0].value + String.fromCharCode(keyCode) + "0").replace(/ /g, ""); //check ignores spaces
var regex = /^/-?/d+((/.|/,)/d+)?$/;
var allowedChars = [8,9,13,27,32,37,39,44,45, 46] //control keys and separators
//allows numbers, separators and controll keys and rejects others
if ((keyCode > 47 && keyCode < 58) || allowedChars.indexOf(keyCode) >= 0) {
//test the string with regex, decline if doesn''t fit
if (elem[0].value != "" && !regex.test(testValue)) {
event.preventDefault();
return false;
}
return true;
}
event.preventDefault();
return false;
});
};
});
Permite:
11 11 .245 (en controlador formateado en desenfoque a 1111.245)
11,44
-123.123
-1 014
0123 (formateado en desenfoque a 123)
no permite:
ps
a B C
11.11.1
11,11.1
.42
Una pequeña corrección a la brillante respuesta de @ rebisco para validar el decimal a la perfección.
function isNumberKey(evt) {
debugger;
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode == 46 && evt.srcElement.value.split(''.'').length>1) {
return false;
}
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
aquí hay un script que te ayuda a:
<script type="text/javascript">
// price text-box allow numeric and allow 2 decimal points only
function extractNumber(obj, decimalPlaces, allowNegative)
{
var temp = obj.value;
// avoid changing things if already formatted correctly
var reg0Str = ''[0-9]*'';
if (decimalPlaces > 0) {
reg0Str += ''/[/,/.]?[0-9]{0,'' + decimalPlaces + ''}'';
} else if (decimalPlaces < 0) {
reg0Str += ''/[/,/.]?[0-9]*'';
}
reg0Str = allowNegative ? ''^-?'' + reg0Str : ''^'' + reg0Str;
reg0Str = reg0Str + ''$'';
var reg0 = new RegExp(reg0Str);
if (reg0.test(temp)) return true;
// first replace all non numbers
var reg1Str = ''[^0-9'' + (decimalPlaces != 0 ? ''.'' : '''') + (decimalPlaces != 0 ? '','' : '''') + (allowNegative ? ''-'' : '''') + '']'';
var reg1 = new RegExp(reg1Str, ''g'');
temp = temp.replace(reg1, '''');
if (allowNegative) {
// replace extra negative
var hasNegative = temp.length > 0 && temp.charAt(0) == ''-'';
var reg2 = /-/g;
temp = temp.replace(reg2, '''');
if (hasNegative) temp = ''-'' + temp;
}
if (decimalPlaces != 0) {
var reg3 = /[/,/.]/g;
var reg3Array = reg3.exec(temp);
if (reg3Array != null) {
// keep only first occurrence of .
// and the number of places specified by decimalPlaces or the entire string if decimalPlaces < 0
var reg3Right = temp.substring(reg3Array.index + reg3Array[0].length);
reg3Right = reg3Right.replace(reg3, '''');
reg3Right = decimalPlaces > 0 ? reg3Right.substring(0, decimalPlaces) : reg3Right;
temp = temp.substring(0,reg3Array.index) + ''.'' + reg3Right;
}
}
obj.value = temp;
}
function blockNonNumbers(obj, e, allowDecimal, allowNegative)
{
var key;
var isCtrl = false;
var keychar;
var reg;
if(window.event) {
key = e.keyCode;
isCtrl = window.event.ctrlKey
}
else if(e.which) {
key = e.which;
isCtrl = e.ctrlKey;
}
if (isNaN(key)) return true;
keychar = String.fromCharCode(key);
// check for backspace or delete, or if Ctrl was pressed
if (key == 8 || isCtrl)
{
return true;
}
reg = //d/;
var isFirstN = allowNegative ? keychar == ''-'' && obj.value.indexOf(''-'') == -1 : false;
var isFirstD = allowDecimal ? keychar == ''.'' && obj.value.indexOf(''.'') == -1 : false;
var isFirstC = allowDecimal ? keychar == '','' && obj.value.indexOf('','') == -1 : false;
return isFirstN || isFirstD || isFirstC || reg.test(keychar);
}
function blockInvalid(obj)
{
var temp=obj.value;
if(temp=="-")
{
temp="";
}
if (temp.indexOf(".")==temp.length-1 && temp.indexOf(".")!=-1)
{
temp=temp+"00";
}
if (temp.indexOf(".")==0)
{
temp="0"+temp;
}
if (temp.indexOf(".")==1 && temp.indexOf("-")==0)
{
temp=temp.replace("-","-0") ;
}
if (temp.indexOf(",")==temp.length-1 && temp.indexOf(",")!=-1)
{
temp=temp+"00";
}
if (temp.indexOf(",")==0)
{
temp="0"+temp;
}
if (temp.indexOf(",")==1 && temp.indexOf("-")==0)
{
temp=temp.replace("-","-0") ;
}
temp=temp.replace(",",".") ;
obj.value=temp;
}
// end of price text-box allow numeric and allow 2 decimal points only
</script>
<input type="Text" id="id" value="" onblur="extractNumber(this,2,true);blockInvalid(this);" onkeyup="extractNumber(this,2,true);" onkeypress="return blockNonNumbers(this, event, true, true);">
una forma alternativa de restringir la entrada a un cuadro de texto para que solo acepte números y el punto decimal es usar javascript dentro de la entrada html. Esto funciona para mí:
<input type="text" class="form-control" id="price" name="price" placeholder="Price"
vrequired onkeyup="this.value=this.value.replace(/[^0-9.]/g, '''').replace(/(/..*)/./g, ''$1'')">
- Acepta--
9
9.99
--No acepto--
9.99.99
A B C
<HTML>
<HEAD>
<SCRIPT language=Javascript>
<!--
function isNumberKey(evt)
{
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode != 46 && charCode > 31
&& (charCode < 48 || charCode > 57))
return false;
return true;
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<INPUT id="txtChar" onkeypress="return isNumberKey(event)"
type="text" name="txtChar">
</BODY>
</HTML>
¡Esto realmente funciona!
<input type="text" class="number_only" />
<script>
$(document).ready(function() {
$(''.number_only'').keypress(function (event) {
return isNumber(event, this)
});
});
function isNumber(evt, element) {
var charCode = (evt.which) ? evt.which : event.keyCode
if ((charCode != 45 || $(element).val().indexOf(''-'') != -1) && (charCode != 46 || $(element).val().indexOf(''.'') != -1) && ((charCode < 48 && charCode != 8) || charCode > 57)){
return false;
}
else {
return true;
}
}
</script>
http://www.encodedna.com/2013/05/enter-only-numbers-using-jquery.htm
<input type="text" onkeypress="return isNumberKey(event,this)">
<script>
function isNumberKey(evt, obj) {
var charCode = (evt.which) ? evt.which : event.keyCode
var value = obj.value;
var dotcontains = value.indexOf(".") != -1;
if (dotcontains)
if (charCode == 46) return false;
if (charCode == 46) return true;
if (charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
</script>
<script type="text/javascript">
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
</script>
@Html.EditorFor(model => model.Orderids, new { id = "Orderids", Onkeypress=isNumberKey(event)})
Esto funciona bien
document.getElementById(''value'').addEventListener(''keydown'', function(e) {
var key = e.keyCode ? e.keyCode : e.which;
/*lenght of value to use with index to know how many numbers after.*/
var len = $(''#value'').val().length;
var index = $(''#value'').val().indexOf(''.'');
if (!( [8, 9, 13, 27, 46, 110, 190].indexOf(key) !== -1 ||
(key == 65 && ( e.ctrlKey || e.metaKey ) ) ||
(key >= 35 && key <= 40) ||
(key >= 48 && key <= 57 && !(e.shiftKey || e.altKey)) ||
(key >= 96 && key <= 105)
)){
e.preventDefault();
}
/*if theres a . count how many and if reachs 2 digits after . it blocks*/
if (index > 0) {
var CharAfterdot = (len + 1) - index;
if (CharAfterdot > 3) {
/*permits the backsapce to remove :D could be improved*/
if (!(key == 8))
{
e.preventDefault();
}
/*blocks if you try to add a new . */
}else if ( key == 110) {
e.preventDefault();
}
/*if you try to add a . and theres no digit yet it adds a 0.*/
} else if( key == 110&& len==0){
e.preventDefault();
$(''#value'').val(''0.'');
}
});
form.onsubmit = function(){
return textarea.value.match(/^/d+(/./d+)?$/);
}
Es esto lo que estás buscando?
Espero que ayude.
EDITAR: edité mi ejemplo anterior para que solo haya un período, precedido por al menos un dígito y seguido de al menos un dígito.
function integerwithdot(s, iid){
var i;
s = s.toString();
for (i = 0; i < s.length; i++){
var c;
if (s.charAt(i) == ".") {
} else {
c = s.charAt(i);
}
if (isNaN(c)) {
c = "";
for(i=0;i<s.length-1;i++){
c += s.charAt(i);
}
document.getElementById(iid).value = c;
return false;
}
}
return true;
}
function isNumberKey(evt)
{
var charCode = (evt.which) ? evt.which : evt.keyCode;
if(charCode==8 || charCode==13|| charCode==99|| charCode==118 || charCode==46)
{
return true;
}
if (charCode > 31 && (charCode < 48 || charCode > 57))
{
return false;
}
return true;
}
Solo permitirá que sea numérico y te permitirá poner "." para decimal
inputelement.onchange= inputelement.onkeyup= function isnumber(e){
e= window.event? e.srcElement: e.target;
while(e.value && parseFloat(e.value)+''''!= e.value){
e.value= e.value.slice(0, -1);
}
}