2009-03-19 11 views
8

Je suis après une regex qui fera correspondre les valeurs numériques avec un nombre de décimales défini par l'utilisateur. Actuellement, j'aiRegex qui correspond numeric avec jusqu'à 2 décimales

/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/ 

qui permettra autant d'endroits que l'entrée mais je voudrais également permettre parfois 2 ou 4 de la monnaie ou plus pour une autre entrée. La fonction que je suis bâtiment est

var isNumeric = function(val, decimals) { 
    // decimals is not used yet 
    var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/; 
    return objRegExp.test(val); 
}; 

Répondre

4

Essayez quelque chose comme ceci:

^\d+\.\d{0,3}$

où "3" est le maximum autorisé décimales.

+0

[Selon MDN] (https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp # quantificateurs), le quantificateur 'x {n, m}' requiert que "n et m soient ** entiers ** positifs ** - ie, 0 n'est pas un limite inférieure valide. [Mais la spécification dit] (https://www.ecma-international.org/ecma-262/5.1/#sec-15.10.1) que le type de 'n' et' m' est 'DecimalDigits', donc 0 est autorisée.MDN est faux ici: Votre expression est conforme à la spécification et sûre à utiliser dans n'importe quel navigateur. – hashchange

17
/^\s*-?[1-9]\d*(\.\d{1,2})?\s*$/ 

Il est bon de pardonner les espaces (\ s). Ce qui précède ne permet pas de commencer par zéro. Si vous voulez permettre cela:

/^\s*-?\d+(\.\d{1,2})?\s*$/ 

Aucun de ces éléments n'autorise un nombre décimal sans rien avant la décimale. Si vous voulez autoriser cela:

/^\s*-?(\d+(\.\d{1,2})?|\.\d{1,2})\s*$/ 
+0

Avez-vous une variation qui permet un «.» De fin sans aucun chiffre après? JavaScript considère ceci comme un nombre valide, tant qu'il n'y a pas deux points de fin ('isNaN (1.) // false') –

1

Ceci doit correspondre à des nombres entiers et décimaux jusqu'à deux décimales.

/\A[+-]?\d+(?:\.\d{1,2})?\z/ 

REMARQUE: Changer le "2" dans "{1,2}" à tout ce que nombre de décimales que vous voulez soutenir.

Je sais que cela ne fait pas partie de votre question, mais vous pouvez le faire sans regex aussi. Voici une solution:

var isNumeric = function(val, decimals) { 
    if (parseFloat(val)) { 
     var numeric_string = val + ''; 
     var parts = numeric_string.split('.', 1); 
     if (parts[1] && parts[1].length > decimals) { 
      alert('too many decimal places'); 
     } 
     else { 
      alert('this works'); 
     } 
    } 
    else { 
     alert('not a float'); 
    } 
} 
+0

Il n'a pas réussi à faire correspondre des entiers ou des décimales avec un ou deux emplacements en utilisant la syntaxe suivante: var regex = new Regex ("/ \\ A [+ -]? \\ d + (?: \\. \\ d {1,2})? \\ z /"); if (regex.IsMatch ("1234")) { –

3

Je suis un gars C# par le commerce, mais je trouve des outils comme The Regulator C# ou RegexPal être très utile lorsque vous essayez de tweak qui Regex d'être « tellement ».

3

Merci à tous. J'ai utilisé un peu de toutes les réponses.

var isNumeric = function(val, decimalPlaces) { 
    // If the last digit is a . then add a 0 before testing so if they type 25. it will be accepted 
    var lastChar = val.substring(val.length - 1); 
    if (lastChar == ".") val = val + "0"; 

    var objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1," + decimalPlaces + "})?|\\.\\d{1," + decimalPlaces + "})\\s*$", "g"); 
    if (decimalPlaces == -1) 
     objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1,25})?|\\.\\d{1,25})\\s*$", "g"); 

    return objRegExp.test(val);   
}; 
3

Ajout de 0 si le dernier chiffre est un "." ne couvre pas le cas des espaces après le point.

Je pense que cela couvre tous les cas, mais vous voudriez le tester plus rigoureusement que j'ai ici.

var isNumeric = function(val, decimals) { 
    if (decimals <= 0) { 
     var re = /^\s*\d+\.?\s*$/; 
     return re.test(val); 
    } else { 
     var reString = "^\\s*((\\d+(\\.\\d{0," + decimals + "})?)|((\\d*(\\.\\d{1," + decimals + "}))))\\s*$" 
     var re = new RegExp(reString); 
     return re.test(val); 
    } 
}; 

var test = function(val, decimals) { 
    document.write("isNumeric(" + val + ", " + decimals + ") = " + isNumeric(val, decimals) + "<br/>"); 
} 

test("123", 0); 
test("123", 5); 
test(" 123.45", 2); 
test(" 123.45", 3); 
test(" 123.45", 1); 
test(" ", 0); 
test(" ", 5); 
test(" 3.", 0); 
test(" 3.", 12); 
test(" .", 3); 
test(" .321 ", 5); 
-1

Essayez cette regex, il fonctionne très bien pour moi:

^\d+\.\d{0,2}$ 
0

Utilisez ce modèle:

[0-9]?[0-9]?(\.[0-9][0-9]?)? 
Questions connexes