MICHELEPISANI.IT
  • Sviluppo
  • ASP
  • Articoli
  • Regular expression per il controllo di valori numerici sia interi che decimali
 

Funzionante per ASP ma il pattern è riutilizzabile anche per gli altri linguaggi

Regular expression per il controllo di valori numerici sia interi che decimali

Regular expression per il controllo di valori numerici sia interi che decimali
Maggio 12
07:552015

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


Tags
Non ci sono tag per questo elemento
Condividi

Autore

Michele Pisani

Michele Pisani

Ho uno spiccato orientamento al problem-solving, se è troppo facile non mi diverto :)
Credo nella volontà e nel cambiamento perchè hanno fatto della mia passione il mio pane quotidiano.
Se devo descrivermi con una sola parola direi... "Concretezza", la mia stretta di mano è una garanzia.

4 Commenti

  1. Conte venerdì 10 giugno 2016 alle ore 15.56

    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

    Rispondi a questo commento
    • Michele PisaniAutore sabato 11 giugno 2016 alle ore 23.29

      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.

      Rispondi a questo commento
  2. alessandro martedì 18 luglio 2017 alle ore 17.17

    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?

    Rispondi a questo commento
    • Michele PisaniAutore venerdì 21 luglio 2017 alle ore 00.15

      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).

      Rispondi a questo commento

Scrivi un Commento

Il tuo indirizzo email non sarà pubblicato.
I campi contrassegnati da un * sono obbligatori

Articoli e Argomenti correlati

Categorie popolari

Iscriviti alla mia newsletter

La tua e-mail con me sarà al sicuro.
Non fornirò mai le tue informazioni a nessuno!

Ultimi commenti

Michele Pisani

Ciao peppe,
che tipo di errore ti dà? Hai verificato se il resto delle caratteristiche è …

peppe

Ciao, perchè non posso unire takeshy kurosawa con takeshy kurosawa shop? non sono nomi simili?

Michele Pisani

Grazie Ottavia, fa sempre piacere ricevere un feedback. Buon proseguimento.

Ottavia Neruda

La tua guida mi è stata utilissima. L'ho trovata semplice, ben fatta ed intuitiva. Grazie.