Determina se una stringa è un intero in Java

Sto provando a determinare se un particolare elemento in una matrice di stringhe è un numero intero o meno.

I am .split(" ")'ing in forma String , e quindi prova a suddividere l’array risultante in due matrici; uno per i numeri interi, uno per gli operatori, mentre si scartano le parentesi e altri oggetti vari. Quale sarebbe il modo migliore per realizzare questo?

Ho pensato che avrei potuto trovare un metodo Integer.isInteger(String arg) o qualcosa del genere, ma non ho avuto tanta fortuna.

Il modo più ingenuo sarebbe quello di iterare su String e assicurarsi che tutti gli elementi siano cifre valide per la determinata radice. Questo è il più efficiente che si possa ottenere, dal momento che devi guardare ogni elemento almeno una volta. Suppongo che potremmo micro-ottimizzarlo in base alla radix, ma a tutti gli effetti questo è il massimo che puoi aspettarti di ottenere.

 public static boolean isInteger(String s) { return isInteger(s,10); } public static boolean isInteger(String s, int radix) { if(s.isEmpty()) return false; for(int i = 0; i < s.length(); i++) { if(i == 0 && s.charAt(i) == '-') { if(s.length() == 1) return false; else continue; } if(Character.digit(s.charAt(i),radix) < 0) return false; } return true; } 

In alternativa, puoi fare affidamento sulla libreria Java per avere questo. Non è basato su eccezioni e cattura quasi tutte le condizioni di errore che puoi immaginare. Sarà un po 'più costoso (devi creare un object Scanner, che in un ciclo critico non vuoi fare, ma generalmente non dovrebbe essere troppo costoso, quindi per il giorno per giorno operazioni dovrebbe essere abbastanza affidabile.

 public static boolean isInteger(String s, int radix) { Scanner sc = new Scanner(s.trim()); if(!sc.hasNextInt(radix)) return false; // we know it starts with a valid int, now make sure // there's nothing left! sc.nextInt(radix); return !sc.hasNext(); } 

Se le migliori pratiche non ti interessano o vuoi trollare il tizio che fa le recensioni del tuo codice, prova questo per le dimensioni:

 public static boolean isInteger(String s) { try { Integer.parseInt(s); } catch(NumberFormatException e) { return false; } catch(NullPointerException e) { return false; } // only got here if we didn't return false return true; } 

Usare l’espressione regolare è meglio.

 str.matches("-?\\d+"); -? --> negative sign, could have none or one \\d+ --> one or more digits 

Non è bene usare NumberFormatException qui se puoi usare if-statement .

Oppure puoi ottenere un piccolo aiuto dai nostri buoni amici su Apache Commons: StringUtils.isNumeric (String str)

O semplicemente

mystring.matches("\\d+")

anche se ritornerebbe vero per i numeri più grandi di un int

Si desidera utilizzare il metodo Integer.parseInt (String) .

 try{ int num = Integer.parseInt(str); // is an integer! } catch (NumberFormatException e) { // not an integer! } 

In alternativa al tentativo di analizzare la stringa e rilevare NumberFormatException , è ansible utilizzare un’espressione regolare; per esempio

 if (Pattern.compile("-?[0-9]+").matches(str)) { // its an integer } 

È probabile che sia più veloce, soprattutto se si precompila e si riutilizza la regex. Tuttavia, il problema è che Integer.parseInt(str) continuerà a fallire se str rappresenta un numero al di fuori dell’intervallo dei valori int legali.

È ansible utilizzare Integer.parseInt(str) e rilevare NumberFormatException se la stringa non è un numero intero valido, nel modo seguente (come indicato da tutte le risposte):

 static boolean isInt(String s) { try { int i = Integer.parseInt(s); return true; } catch(NumberFormatException er) { return false; } } 

Tuttavia, si noti qui che se il numero intero valutato viene espulso, viene generata la stessa eccezione. Il tuo scopo era scoprire se fosse o meno un numero intero valido. Quindi è più sicuro fare il tuo metodo per verificare la validità:

 static boolean isInt(String s) // assuming integer is in decimal number system { for(int a=0;a 

È ansible utilizzare Integer.parseInt() o Integer.valueOf() per ottenere il numero intero dalla stringa e rilevare l’eccezione se non è un int parsable. Vuoi essere sicuro di prendere la NumberFormatException che può lanciare.

Potrebbe essere utile notare che valueOf () restituirà un object intero, non il primitivo int.

 public boolean isInt(String str){ return (str.lastIndexOf("-") == 0 && !str.equals("-0")) ? str.substring(1).matches( "\\d+") : str.matches("\\d+"); }