Per processare un valore al fine di verificarne il tipo prima di procedere con eventuali utilizzi successivi è possibile utilizzare, tra i vari metodi, le espressioni regolari che se ben costruite, data la loro naturale funzionalità, garantiscono il risultato con il minimo sforzo. In questo articolo vedremo come filtrare, tramite una regular expression, valori numerici sia interi che decimali. L'impiego di tale funzione vale, ad esempio, in qualsiasi ambito dove vengono trattate le valute, così come anche i pesi e in tutti quei casi un valore numerico è da considerarsi valido sia in forma di intero che di valore decimale. La regex (regular expression) riportata nell'esempio di seguito (funzionante per ASP ma il pattern è riutilizzabile anche per gli altri linguaggi) è in grado di accettare numeri a 10 cifre interi e decimali a una o due cifre separati da un punto ".":
^[0-9]d{0,9}(.d{1,2})?%?$
N.B: per problemi di visualizzazione non compare il carattere escape immediatamente prima di ciascuna lettera 'd'. Per fare in modo che questa regex funzioni è necessario inserire il carattere BACKSLASH prima di ciascuna lettera 'd'.
L'esempio completo:
str_pattern = "^[0-9]d{0,9}(.d{1,2})?%?$"
Set regEx = New RegExp
regEx.Pattern = str_pattern
regEx.Global = true
Set RegExResults = regEx.Execute(val_selected)
Set regEx = Nothing
If RegExResults.Count > 0 Then
For Each match In RegExResults
Response.Write match.Value & "<br />"
Next
End If
N.B: per problemi di visualizzazione non compare il carattere escape immediatamente prima di ciascuna lettera 'd'. Per fare in modo che questa regex funzioni è necessario inserire il carattere BACKSLASH prima di ciascuna lettera 'd' all'interno della variabile 'str_pattern'.
Di seguito alcuni casi in cui la regex restituisce "1" (TRUE):
val_selected = 1
val_selected = 0.01
val_selected = 3.2
val_selected = 1234567890.12
val_selected = "45.98"
I seguenti valori invece restituiranno "0" (FALSE):
val_selected = "abcd"
val_selected = 123456789012.12
val_selected = ".34"
val_selected = "12."
L'espressione regolare in questione è personalizzabile ed è possibile modificare:
^[0-9] le cifre con cui un numero può iniziare
d{0,9} di quante cifre intere può essere costituito un numero
. il separatore
d{1,2} quante cifre decimali sono accettate
Grazie per le indicazioni!
Avrei una domanda: vorrei poter accettare in input utente sia la virgola che il punto come separatore decimale e convertire tutto in virgola.
E' possibile?
Grazie
Ciao Conte,
non ho effettuato una prova diretta ma in teoria per fare quello di cui hai bisogno dovrebbe bastare sostituire nell'espressione regolare il punto, quello dopo la prima parentesi tonda aperta, con questo: [,.]
Successivamente da codice effettuare un replace convertendo l'eventuale punto in virgola.
ciao sto cercando una regex per numeri interi o decimali, positivi o negativi; la tua regex mi pare vada bene per interi o decimali, ma se volessi adattarla ai negativi?
Ciao alessandro,
questa regex dovrebbe fare al caso tuo:
^[-0-9]\d{0,9}(.\d{1,2})?%?$
In pratica con una piccola modifica effettuata a quella presente nell'articolo riconosce numero decimali anche negativi (il separatore può essere indistintamente il punto o la virgola).
Ciao Michele, ti ringrazio per l'articolo. Potresti spiegare il significato della parte (.d{1,2})?\%?$ ?
Ti ringrazio
Ciao francesco,
quella parte indica che dopo il punto (inteso come separatore decimale) ci può essere qualsiasi carattere numerico composto da una o due cifre e che il tutto termina così com'è o con il simbolo della percentuale (nel caso di valore percentuale).
Fammi sapere se non ti torna quanto descritto, tieni presente che come ho scritto nel testo dell'articolo all'interno del blocco di codice potrebbero esserci problemi di visualizzazione con il carattere escape nella regex mostrata.