PDA

View Full Version : [JAVA] ... ed espressioni regolari


javacomelava
26-06-2009, 20:30
Salve.

Ho un JTextField in cui vorrei che fosse possibile immettere solo numeri,interi e in virgola mobile.Un utente che la utilizza dovrà essere quindi in grado di poter immettere solo stringhe del tipo:

10
1.3
-2
-2.5

Girovagando su goole ho trovato questa classe che permettesse di inserire tramite espressione regolare solo dei valori numerici nel JTextField:


import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class NumberDocument extends PlainDocument {
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if(str!=null && str.matches("[0-9]*"))
super.insertString(offs, str, a);
}
}


Questo è il codice della JTextField:
campoTesto=new JTextField(15);
campoTesto.setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.BLUE));
campoTesto.setHorizontalAlignment(JTextField.RIGHT);
campoTesto.setDocument(new NumberDocument());


In pratica setto tramite l'espressione regolare un Document per JTextField.

Come faccio a modificare l'espressione regolare affinche mi accetti anche stringhe che rappresentino numeri in virgola mobile e che eventualmente possono essere anche negativi?

Non ricordo molto su questo argomento :muro:

Grazie anticipate per le risp

Energy++
26-06-2009, 20:51
questa dovrebbe andare :)

-{0,1}[0-9]*\.*[0-9]*

e quindi

str.matches("[-{0,1}[0-9]*\\.*[0-9]*")

javacomelava
26-06-2009, 21:22
funziona perfetto,ti ringrazio.
Avevo scritto la stessa espr. regolare,ma sbagliavo la sintassi con cui java le accetta.

Ora se volessi che SOLO IL PRIMO CARATTERE INSERITO POSSA ESSERE - o + dovrei fare un controllo sull'input?? non posso farlo tramite expr regolare vero??? In questo modo è vero che l'utente può inserire sia segno che virgola che numero però potrebbe anche inserire qualcosa senza senso del tipo:

34-3.4.2.....3

Piu precisamente: Posso costruire la FORMA DELL'input attraverso espr regolare o posso solo dire quali sono i caratteri ammessi.Io ricordo che in pratica le espr regolare servivano proprio per comporre la struttura delle stringhe.Del tipo che l'alfabeto erano i segni accettati(nel mio caso Alfabeto={0,1,2,3,4,5,6,7,8,9,-,.} e per struttura l'espressione regolare che mi hai appena scritto.

Cosi però è vero che permetti di scrivere solo quei simboli,ma posso metterli come mi pare.Consigli?

fero86
26-06-2009, 22:31
questa dovrebbe andare :)

-{0,1}[0-9]*\.*[0-9]* asterisco significa 0 o piu volte, quindi questo se non erro dovrebbe accettare anche cose come queste: 123.......456

io scriverei cosi (gli slash sono giá raddoppiati affinché la stringa possa essere inserita nel codice): "[\\-|\\+]?[0-9]*\\.?[0-9]*" non so se é giusto.

Energy++
26-06-2009, 22:41
senza considerare il +

per risolvere il problema del punto:

-?[0-9]*\\.?[0-9]*

:)


quella di fero86 va benissimo

javacomelava
26-06-2009, 23:00
confermo che funziona a livello "alfabetico".Va meno bene dal punto di vista strutturale.Eppure sembra essere chiara la struttura a livello di espressione regolare.Mi chiedo se per ottenere la struttura devo gestire la cosa a livello di if/else nel corpo della stringa.

Ripeto che ora è vero che posso scrivere solo: numeri , - , .

Il problema è che potrei anche inserire qualcosa del genere:

33-....5.3.

Questo qualcosa non va bene per la mia applicazione.Voglio che sia ben formattato quel che inserisce l'utente nel JTextField.Ovvero:

-1.3 (ovvero un qualsiasi numero decimale che può eventualmente essere negativo ed in virgola mobile)

Energy++
26-06-2009, 23:12
no, non puoi scrivere

33-....5.3.

str.matches("-?[0-9]*\\.?[0-9]*") ritornerà true solo con 12, -12, 12.44, -12.55

str.matches("[\\-|\\+]?[0-9]*\\.?[0-9]*") ritornerà true solo con 2, -12, 12.44, -12.55, +12, +56.6

in tutti gli altri casi ritornerà false

javacomelava
26-06-2009, 23:32
no, non puoi scrivere

33-....5.3.

str.matches("-?[0-9]*\\.?[0-9]*") ritornerà true solo con 12, -12, 12.44, -12.55

str.matches("[\\-|\\+]?[0-9]*\\.?[0-9]*") ritornerà true solo con 2, -12, 12.44, -12.55, +12, +56.6

in tutti gli altri casi ritornerà false

Guarda,ho fatto copia e incolla ma niente...solo alfabeticamente rispetta i vincoli,non a livello strutturale.In ogni caso ho risolto con un pò di if else nel corpo di getText() del mio JTextField.Domani al massimo vi posto il codice dell'applicazione(che altro non è che una semplice calcolatrice....sto impratichendomi con swing :D )

Grazie per le risposte comunque!Saluti!

^TiGeRShArK^
27-06-2009, 12:41
non basterebbe questa?

[-|+][0-9]*.[0-9]*

00pipp00
27-06-2009, 13:24
Io userei le libererie BoIG e introdurrei un parametro offuscato per indicizzare i dati per poi passarli al Jreader massimizzando le prestazioni...

00pipp00
27-06-2009, 13:35
.

fero86
27-06-2009, 13:45
non basterebbe questa?

[-|+][0-9]*.[0-9]*
ci sono tre errori: primo, questa ti obbliga a mettere + o -, secondo il carattere - tra parentesi quadre serve ad esprimere ranges di caratteri quindi sarebbe meglio farne l'escaping, e terzo nelle espressioni regolari il punto significa "qualsiasi carattere", quindi di questo devi sicuramente fare l'escaping; correggendo queste tre cose e facendo per sicurezza anche l'escaping del carattere + (che nelle espressioni regolari significa "una o piu volte") ottieni pari pari la mia :D