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
May 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

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.

6 Commenti

  1. Conte Friday, June 10, 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 Saturday, June 11, 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 Tuesday, July 18, 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 Friday, July 21, 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
  3. Francesco Monday, September 25, 2017 alle ore 14:35

    Ciao Michele, ti ringrazio per l'articolo. Potresti spiegare il significato della parte (.d{1,2})?\%?$ ?
    Ti ringrazio

    Rispondi a questo commento
    • MicheleAutore Tuesday, September 26, 2017 alle ore 08:22

      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.

      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

Il Canale YouTube in ITALIANO

1 VIDEO GRATIS ogni 2 settimane! ISCRIVITI!

Entra a far parte della community su Facebook

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

Hai verificato se succede per tutte le pagine da un certo periodo di tempo in poi o solo su alcune?

Tecnowiz

Sono amministratore di un blog pure io... Intanto ti faccio i complimenti per questo articolo. …

Michele Pisani

Ciao Antonio, grazie per la fiducia :) In caso di più fogli è necessario inserire il codice del …

Antonio

Ciao Michele, ho acquistato il tuo libro che unitamente ai tuoi video sta diventando il mio corso …