Comment faire de type = "nombre" uniquement des nombres positifs

285

actuellement j'ai le code suivant

<input type="number" />

il ressort de quelque chose comme ça

entrez la description de l'image ici

Les petits éléments de sélection à droite permettent au nombre de devenir négatif. Comment puis-je empêcher cela?

J'ai des doutes sur l'utilisation type="number", cela cause plus de problèmes que ça ne résout, je vais quand même le vérifier, alors devrais-je simplement recommencer à utiliser type="text"?

Arian Faurtosh
la source
4
Vous devrez toujours valider la valeur sur le serveur. N'importe qui peut remplacer le champ pour envoyer le contenu qu'il souhaite.
zzzzBov
2
@zzzzBov Oui, je le valide avec php, et j'utilise également des instructions prepare, la seule chose qui reste à se soucier, ce sont les utilisateurs qui savent comment utiliser un navigateur Web. lol
Arian Faurtosh
1
Duplication possible de Y a
Vega

Réponses:

636

Ajouter un minattribut

<input type="number" min="0">

Quentin
la source
37
Cela fonctionne pour les flèches de sélection, mais permet de taper un nombre négatif
David Burton
2
Changer l'attribut en min="0.000001"aidera dans la plupart des cas. Plus de 6 décimales, JavaScript le convertira au format exposant.
MarkMYoung
Par défaut, cela n'autorise que les entiers mais pas les décimales. Voir Autoriser les valeurs décimales .
str
118

J'ai trouvé une autre solution pour éviter un nombre négatif.

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">
Kushal
la source
Vous ne pouvez pas ajouter de nombres flottants avec cela. De plus, le stepper numérique ne fonctionne pas ici aussi.
hamzox
1
oninput="validity.valid||(value='');"empêche l'un de taper des nombres
Hello Universe
5
Cela devrait être marqué comme une réponse valide car cela empêche également de taper le caractère "-"
JanBrus
Cela fonctionne très bien si vous avez besoin uniquement de nombres entiers positifs, comme je l'ai fait. Merci!
Boris
74

Cela dépend de la précision que vous souhaitez être. Si vous souhaitez n'accepter que des entiers, alors:

<input type="number" min="1" step="1">

Si vous voulez des flottants avec, par exemple, deux chiffres après le point décimal:

<input type="number" min="0.01" step="0.01">

Pavlo
la source
Il semble actuellement que cela fonctionne sans étape = "1" ... dois-je encore l'ajouter?
Arian Faurtosh
@Arian, vous pouvez l'omettre tant que vous ne spécifiez pas de maxvaleur.
Pavlo
1
L'étape 1 est le navigateur par défaut, ça va
Stephan Muller
4
Cela n'empêche pas encore de taper de mauvaises valeurs - si vous omettez la valeur de l'étape, chrome réduit la validation qu'il fait lors de la frappe afin que vous puissiez entrer des valeurs non numériques. Avec l'étape définie, il vous permet uniquement de taper des valeurs en dehors de la plage min-max - toujours faux, mais mieux.
David Burton
min = "1" step = "1" me permet toujours de taper des nombres flottants comme 1.2 Comment puis-je forcer un entier uniquement?
Sam
51

Vous pouvez forcer l'entrée à contenir uniquement un entier positif en ajoutant onkeypress dans la inputbalise.

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

Ici, event.charCode >= 48 garantit que seuls les nombres supérieurs ou égaux à 0 sont renvoyés, tandis que la minbalise garantit que vous pouvez atteindre un minimum de 1 en faisant défiler la barre de saisie.

Shubham Mittal
la source
3
Sur Edge, vous pouvez saisir "A" dans ce champ.
Amy Blankenship le
10
Vous pouvez toujours coller le nombre négatif
méthyl
5

Vous pouvez utiliser ce qui suit pour type="number"accepter uniquement les nombres positifs:

input type="number" step="1" pattern="\d+"
Deepali
la source
2
Pouvez-vous essayer d'expliquer ce que fait votre déclaration et pourquoi elle aide? En outre, vous disposez de deux extraits de code différents. Laquelle est correcte?
Aenadon
2
en ajoutant un attribut d'étape, vous limitez l'entrée à un entier et l'ajout du modèle garantit que toute utilisation d'une partie fractionnaire obtient le champ marqué comme invalide mais dépend des implémentations du navigateur (Firefox marque le champ en rouge lorsque l'entrée perd le focus tandis que Chrome ne le laisse pas vous entrez des valeurs non autorisées en premier lieu). Il faut valider cela sur le serveur / client.
Deepali
5

Vous pouvez empêcher la saisie négative dans un formulaire de saisie de nombres de la manière suivante:

<input type="number" onkeyup="if(this.value<0){this.value= this.value * -1}">

Hafijur Rahman Sakib
la source
3

Essayer

<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">

Rogerio de Moraes
la source
Lorsque vous définissez un type, vous avez besoin d'un format spécifique pour le rôle.
Rogerio de Moraes
7
J'ai essayé cela en chrome, et cela n'impose pas le modèle
David Burton
Existe-t-il un moyen si j'ajoute type = "text" au lieu de "number"?
Kapil Verma
1

Si vous avez besoin de saisie de texte , le modèle fonctionne également

<input type="text" pattern="\d+">
ABDO
la source
1

Je ne trouve pas la solution parfaite car certains travaux pour la saisie mais pas pour le copier-coller, certains sont l'inverse. Cette solution fonctionne pour moi. Il empêche de nombre négatif, en tapant "e", copier et coller du texte "e".

créer une fonction.

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

ajoutez ces propriétés à l'entrée. ces deux empêchent de copier et coller du texte non numérique, y compris "e". vous devez avoir les deux ensemble pour prendre effet.

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

Si vous utilisez Vue, vous pouvez consulter cette réponse ici . Je l'ai extrait dans un mixin qui peut être réutilisé.

Arst
la source
0

ajoutez ce code dans votre type d'entrée;

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

par exemple:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />
Sakawa Bob
la source
1
c'est vraiment déroutant pour quiconque ne comprend pas ce qui se passe.
RozzA
De cette façon, vous pouvez toujours coller quoi que ce soit sur l'entrée, l'alphabet ou même des caractères spéciaux
Lê Gia Lễ
0

Une autre solution consiste à utiliser Js pour le rendre positif (l'option min peut être désactivée et n'est pas valide lorsque l'utilisateur tape smth) L'événement négatif si n'est pas nécessaire et on ('keydown') peut également être utilisé!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});
Andres Paul
la source
0

Cela dépend si vous voulez un champ int ou float. Voici à quoi ressembleraient les deux:

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

Le champ int a la validation correcte qui lui est attachée, puisque son min est 1. Le champ float accepte 0, cependant; pour y faire face, vous pouvez ajouter un validateur de contrainte supplémentaire :

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddle ici.

Notez qu'aucune de ces solutions n'empêche complètement l'utilisateur d'essayer de taper une entrée non valide, mais vous pouvez appeler checkValidityoureportValidity déterminer si l'utilisateur a tapé une entrée valide.

Bien sûr, vous devriez toujours avoir une validation côté serveur car l'utilisateur peut toujours ignorer la validation côté client.

kevinji
la source
0

Essaye ça:

  • Testé en angulaire 8
  • les valeurs sont positives
  • Ce code gère également nullet negitivevaleurs.
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />
geeth-marathi
la source
0

Si vous essayez d'entrer un nombre négatif, l'événement onkeyup bloque cela et si vous utilisez la flèche sur le numéro d'entrée, l'événement onblur résout cette partie.

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>

Wictor Chaves
la source
-2

Avec le type d'entrée de texte, vous pouvez l'utiliser pour une meilleure validation,

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();
Anurag
la source
-4

Essaye ça:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
user10132380
la source