2010-08-17 15 views
16

Sto eseguendo il porting di un piccolo frammento di codice PHP su java in questo momento e mi sono basato sulla funzione is_numeric($x) per determinare se $x è un numero o meno. Non sembra esserci una funzione equivalente in java e non sono soddisfatto delle soluzioni attuali che ho trovato finora.La soluzione più elegante isNumeric() per java

sto sporgendosi verso la soluzione espressione regolare trovato qui: http://rosettacode.org/wiki/Determine_if_a_string_is_numeric

Quale metodo dovrei usare e perché?

+0

Cosa intendi esattamente per numerico? Vuoi esattamente la definizione di PHP? http://php.net/manual/en/function.is-numeric.php –

+0

Non deve corrispondere esattamente alla definizione di PHP, ma sarebbe bello se lo facesse dato che so che il mio algoritmo funziona con quella funzione. – Doug

risposta

16

Si noti che la funzione PHPNumerica() determinerà correttamente che l'esadecimale e la notazione scientifica sono numeri, a cui l'approccio regex a cui si fa il collegamento non lo farà.

Un'opzione, specialmente se si stanno già utilizzando le librerie di Apache Commons, è quella di utilizzare NumberUtils.isNumber(), da Commons-Lang. Gestirà gli stessi casi gestiti dalla funzione PHP.

+0

Quella funzione sembra fare esattamente quello che voglio, ma non sto usando la libreria di apache commons :( – Doug

+3

@Doug Commons lang esiste praticamente in ogni programma java, aiuta in così tanti modi. per il tuo percorso di classe, sarai contento di averlo fatto – TheLQ

+2

È sempre difficile decidere se è giustificato aggiungere una libreria quando ne hai bisogno solo una piccola parte. Ma è probabile che, se ci guardi dentro, troverai che Apache Commons Lang può darti altre cose che useresti: fondamentalmente "le cose che dovrebbero essere integrate in Java ma non lo sono". Consiglio vivamente il Common Java Cookbook (http://www.discursive.com/ libri/cjcook/reference/book-cjcook.html) che fornisce molti suggerimenti per l'utilizzo delle librerie di Apache. –

1

Hai provato Integer.parseInt()? (Non sono sicuro del nome del metodo, ma la classe Integer ha un metodo che crea un oggetto intero dalle stringhe). Oppure, se devi gestire numeri non interi, sono disponibili metodi simili anche per gli oggetti Double. Se questi falliscono, viene generata un'eccezione.

Se è necessario analizzare numeri molto grandi (maggiori di int/double) e non è necessario il valore esatto, è sufficiente un semplice metodo basato su espressioni regolari.

+2

Se si prevede di avere una percentuale ragionevole di stringhe che non sono numeriche, l'utilizzo di un'eccezione generata per trovarle è una cattiva pratica (una stringa non numerica non è "eccezionale") e potrebbe causare problemi di prestazioni. –

+0

Questo è vero. Dipende dagli scenari di utilizzo. –

2

In genere è una cattiva idea avere un numero in una stringa. Se si desidera utilizzare questo numero, analizzarlo e utilizzarlo come valore numerico. Non è necessario "controllare" se si tratta di un valore numerico, o si desidera utilizzarlo come valore numerico oppure no.

Se avete bisogno di convertirlo, quindi è possibile utilizzare tutti i parser Integer.parseInt(String)-BigDecimal(String)

Se avete solo bisogno di controllare che il contenuto può essere visto come un numerico allora si può ottenere via con le espressioni regolari.

E non utilizzare il parseInt se la stringa può contenere un float.

+0

Di solito, se qualcuno sta cercando un metodo isNumeric, maledettamente non ha inserito il numero scarso nella stringa;) – Jostikas

4

Hai esaminato utilizzando StringUtils library? C'è una funzione isNumeric() che potrebbe essere ciò che stai cercando. (Si noti che "" sarebbe stato valutato come true)

+0

La funzione CommonsNumeric cerca solo numeri interi - rifiuterà, ad esempio, un numero contenente un numero punto decimale e certamente non accetta la notazione scientifica. Vedi la mia risposta per una diversa funzione di Commons che sembra più vicina a ciò che stai cercando. –

+0

@JacobM: in effetti, ho visto questo NumberUtils ed era pronto ad aggiornare la mia risposta quando ho visto il tuo commento. –

2

Opzionalmente è anche possibile utilizzare un'espressione regolare.

+0

Ciò che è con questo ultimo '+'? '" -7.0-4.2 "' restituirà true a questa espressione. – Doug

0

In un linguaggio fortemente tipizzato, un metodo generico isNumeric (String num) non è molto utile. 13214384348934918434441 è numerico, ma non si adatta alla maggior parte dei tipi. Molti di quelli in cui è in forma non restituiranno lo stesso valore.

Come ha notato Colin, non è consigliabile trasportare numeri in stringhe con l'applicazione. La funzione isNumberic dovrebbe essere applicabile solo per i dati di input sui metodi di interfaccia. Questi dovrebbero avere una definizione più precisa di isNumeric. Altri hanno fornito varie soluzioni. Le espressioni regolari possono essere utilizzate per testare un numero di condizioni contemporaneamente, inclusa la lunghezza della stringa.

0

Basta usare if ((x instanceof Number)

// se il controllo per il numero analizzabile anche

|| (x instanceof String & & x.matches ("((- | \ +)? [0-9] + (\. [0-9] +)?) + "))

) { ...}
// --- Tutti i tipi numerici compresi BigDecimal estendere Numero

Problemi correlati