Esistono vari modi per testare se un campo è un numero valido. Riassumiamo le varie tecniche possibili.
Codice operativo TESTN
Il codice operativo TESTN
consente di verificare se un campo alfanumerico contiene un numero valido.
Manuale di riferimento IBM i 7.3: http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzasd/zztestn.htm#zztestn.
Il codice operativo TESTN non ha una sintassi equivalente per il formato libero.
I 3 indicatori risultato restituiscono informazioni sul contenuto del campo risultato.
Il consiglio è di testare l’indicatore del “maggiore” (pos. 71-72): se è *on allora il campo è un numero valido.
Alcuni esempi utilizzando un campo alfanumerico di 8 caratteri:
Valore | HI | LO | EQ |
tutti blanks | *off | *off | *on |
00001234 | *on | *off | *off |
1234 | *off | *off | *off |
1234,56 | *off | *off | *off |
1.234,56 | *off | *off | *off |
-1234g | *off | *off | *off |
A0001234 | *off | *off | *off |
-1234 | *off | *off | *off |
1234- | *off | *off | *off |
1234,56- | *off | *off | *off |
-1234,56 | *off | *off | *off |
Funzione %CHECK
Un altro metodo per verificare se il contenuto di un campo alfanumerico sia effettivamente un numero è la ricerca tramite la funzione %CHECK di caratteri che non siano ‘0123456789’.
Se il risultato della funzione %check è 0 significa che il campo f1 è un numero valido.
P.es.:
d f1 s 8a d i s 3u 0 d elnum s 10a inz('0123456789') c eval i = %check(elnum:f1)
Funzione %DEC
Come ultimo metodo (non nascondo che a mio parere è quello da preferire) si può utilizzare la funzione %DEC in combinazione con il codice operativo MONITOR.
Ovvero si tenta di convertire in un campo numerico il campo alfanumerico monitorando eventuali errori con il construtto MONITOR. In caso di errore (status code = 105 ovvero messaggio RNQ0105) significa che il campo alfanumerico non conteneva un numero valido.
Ritengo preferibile questo metodo rispetto ai precedenti perché la funzione %dec consente di ottenere come risultato un numero valido in un maggior numero di casi che coi metodi precedenti avrebbero dato risultato negativo.
P.es.:
d f1 s 8a d wrk s 8p 2 d errnum s 1n errnum = *off; monitor; wrk = %dec(f1:8:2); on-error; errnum = *on; endmon;
Valore | Risultato |
tutti blanks | errore |
00001234 | 1234,00 |
1234 | 1234,00 |
1234,56 | 1234,56 |
1.234,56 | errore |
-1234g | errore |
A0001234 | errore |
-1234 | -1234,00 |
1234- | -1234,00 |
1234,56- | -1234,56 |
-1234,56 | -1234,56 |
Come si può vedere dalla tabella precedente comparata con quella presente nel paragrafo del codice operativo TESTN si può notare facilmente come si ottengano molti più casi di conversione in numero con esito positivo grazie alla funzione %dec che interpreta correttamente il segno negativo e il separatore dei decimali.