[RESOLU] Limiter un champ à des nombres, et à une décimale

Eléphant du PHP | 337 Messages

29 janv. 2016, 14:58

Bonjour,

J'ai un champ de saisie que j'aimerais limiter au format suivant : (X)X.Y

En gros, un nombre décimal, avec un ou deux chiffres avant la virgule, puis un point (ou une virgule qui se change en point), puis un chiffre après la virgule. Ou tout simplement un chiffre rond, sans décimale.

J'ai codé pas mal de truc, mais je n'arrive pas à résoudre tous les cas de figures : c'est tout con a priori, mais en fait pas tant que ça ! Quelqu'un a-t-il une solution miracle ? Ou un script qui marche ? :D

Merci de votre aide.

Avatar du membre
Mammouth du PHP | 1609 Messages

29 janv. 2016, 19:20

Bonjour, peut être avec ce plugin jquery ?
https://igorescobar.github.io/jQuery-Mask-Plugin/

Tu peux surement en trouver un tas d'autres. ;)
Développeur web depuis + de 20 ans

Eléphant du PHP | 337 Messages

02 févr. 2016, 01:08

Pas mal en effet ce truc ! Merci je vais essayer :)

Mammouth du PHP | 2703 Messages

02 févr. 2016, 01:22

var re = /^\d+([.,]\d)?$/;
var str = '22,4';
var m;

if ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
// View your result using the m-variable.
// eg m[0] etc.
}

Eléphant du PHP | 337 Messages

03 févr. 2016, 11:52

Wow... j'ai rien compris à ce code ! Si, j'ai compris qu'il y avait une expression régulière, mais c'est tout. :lol:
Faut dire, je ne suis décidément pas une flèche en javascript :roll:

Bon, j'essaye quand même, parce que la solution jQuery donnée plus haut est un peu lourde pour ce que je veux faire.

ynx
Mammouth du PHP | 586 Messages

03 févr. 2016, 13:14

Salut,

Une autre possibilité en html5 :
<input type="number" min="0" max="99.99" step="0.01">

<input type="text" pattern="([1-9]?[0-9]?)+(\,[0-9][0-9]?)?">
Bonne journée

Eléphant du PHP | 337 Messages

04 févr. 2016, 15:35

La solution HTML5 est absoluement GENIALE ! J'opte pour ça :)
Merci beaucoup !

Eléphant du PHP | 337 Messages

07 févr. 2016, 23:45

Pour ceux que ça intéresse pour plus tard, j'ai finalement refait un script en partant de zéro, ne trouvant pas mon bonheur ailleurs.

Les conditions sont les suivantes :
  • uniquement des chiffres ou un point (ou une virgule qui se transforme en point)
  • pas plus d'une décimale après la virgule
  • pas de point ou de virgule en premier caractère

Code : Tout sélectionner

function Calculatrice_Format(id) { var champ = document.getElementById(id); var texte = champ.value; var n = texte.length; var i; var car; var point = 0; var retour = ""; for(i=0 ; i<n ; i++) { car = texte.substring(i,i+1); nb = parseInt(car); // Point ou virgule if(car == "," || car == ".") { // Pas de point en 1er caractère if(i != 0 && point == 0) { retour += "."; point = 1; } } else if(Number.isInteger(nb) == true) { if(point < 2) retour += texte.substring(i,i+1); // Si un point a déjà été mis, alors ce chiffre est une décimale if(point == 1) point = 2; } } // Renvoi de la valeur champ.value = retour; }
Voilà, a priori c'est efficace. J'ai peut-être réinventé la roue (la roue de trottinette, quoi...) mais ça fonctionne :D

Edit : je précise que la fonction est appelée sur onKeyUp, onMouseUp et onChange