2009-03-19 27 views
8

Sono dopo una regex che corrisponderà ai valori numerici con un numero definito dall'utente di cifre decimali. Attualmente hoRegex che corrisponde a numerico con un massimo di 2 posizioni decimali

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

che permetterà più posti di ingresso ma vorrei anche per permettere a volte 2 per valuta o 4 o più per altro ingresso. La funzione Sto costruendo è

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

risposta

4

provare qualcosa di simile:

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

dove "3" è il massimo cifre decimali consentite.

+0

[Secondo MDN] (https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Global_Objects/Quantificatori RegExp #), il quantificatore 'x {n, m}' richiede che "n e m siano ** positivi ** interi" - cioè, 0 non è un limite inferiore valido. [Ma le specifiche dicono] (https://www.ecma-international.org/ecma-262/5.1/#sec-15.10.1) che il tipo di 'n' e' m' è 'DecimalDigits', quindi 0 È permesso.MDN è sbagliato qui: la tua espressione è conforme alle specifiche e sicura da usare in qualsiasi browser. – hashchange

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

È bello essere indulgenti per gli spazi vuoti (\ s). Quanto sopra non consente di iniziare con zero. Se si desidera consentire:

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

Nessuno dei precedenti consente un numero decimale con nulla prima della posizione decimale. Se si desidera consentire:

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

Avete una variazione che consente di seguire '.' senza cifre dopo di essa? JavaScript considera questo numero valido, purché non ci siano _two_ trailing dots ('isNaN (1.) // false') –

1

Questo deve corrispondere a numeri interi e decimali fino a due posizioni decimali.

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

NOTA: Modificare il "2" in "{1,2}" a qualsiasi numero di cifre decimali che si desidera supportare.

So che questo non fa parte della tua domanda, ma puoi farlo anche senza regex. Ecco una soluzione:

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

Questo errore non corrisponde a numeri interi o decimali con uno o due punti utilizzando la seguente sintassi: var regex = new Regex ("/ \\ A [+ -]? \\ d + (?: \\. \\ d {1,2})? \\ z /"); if (regex.IsMatch ("1234")) { –

3

Sono un C# ragazzo di mestiere, ma trovo strumenti come The Regulator per C# o RegexPal ad essere estremamente utile quando si cerca di tweak che Regex per essere "solo così".

3

Grazie a tutti. Ho usato un po 'da tutte le risposte.

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

Aggiungendo che 0 se l'ultima cifra è un "." non copre il caso di spazi bianchi dopo il punto.

Penso che questo copra tutti i casi, ma vorresti testarlo in modo più rigoroso di quello che ho qui.

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

Prova questo regex, tutto funziona bene per me:

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

Utilizzare questo modello:

[0-9]?[0-9]?(\.[0-9][0-9]?)? 
Problemi correlati