Domanda Come posso convertire una stringa in un int in Java?


Come posso convertire a String ad int in Java?

My String contiene solo numeri e voglio restituire il numero che rappresenta.

Ad esempio, data la stringa "1234" il risultato dovrebbe essere il numero 1234.


2513
2018-04-07 18:27


origine


risposte:


String myString = "1234";
int foo = Integer.parseInt(myString);

Vedere il Documentazione Java per maggiori informazioni.


3552
2018-04-07 18:29



Ad esempio, qui ci sono due modi:

Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);

C'è una leggera differenza tra questi metodi:

  • valueOf restituisce un'istanza nuova o memorizzata nella cache di java.lang.Integer
  • parseInt ritorna primitivo int.

Lo stesso vale per tutti i casi: Short.valueOf/parseShort, Long.valueOf/parseLong, eccetera.


588
2018-04-07 18:36



Bene, un punto molto importante da considerare è che il parser Integer genera NumberFormatException come indicato in Javadoc.

int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
      //Will Throw exception!
      //do something! anything to handle the exception.
}

try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
      //No problem this time, but still it is good practice to care about exceptions.
      //Never trust user input :)
      //Do something! Anything to handle the exception.
}

È importante gestire questa eccezione quando si tenta di ottenere valori interi da argomenti divisi o l'analisi dinamica di qualcosa.


215
2018-04-30 06:54



Fallo manualmente:

public static int strToInt( String str ){
    int i = 0;
    int num = 0;
    boolean isNeg = false;

    //Check for negative sign; if it's there, set the isNeg flag
    if (str.charAt(0) == '-') {
        isNeg = true;
        i = 1;
    }

    //Process each character of the string;
    while( i < str.length()) {
        num *= 10;
        num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
    }

    if (isNeg)
        num = -num;
    return num;
}

72
2017-09-11 02:08



Attualmente sto facendo un incarico per il college, dove non posso usare certe espressioni, come quelle sopra, e guardando la tabella ASCII, sono riuscito a farlo. È un codice molto più complesso, ma potrebbe aiutare gli altri a essere ristretti come me.

La prima cosa da fare è ricevere l'input, in questo caso, una stringa di cifre; Lo chiamerò String numbere in questo caso, lo esemplificerò usando il numero 12, quindi String number = "12";

Un altro limite era il fatto che non potevo usare cicli ripetitivi, quindi, a for ciclo (che sarebbe stato perfetto) non può essere utilizzato neanche. Questo ci limita un po ', ma poi di nuovo, questo è l'obiettivo. Dal momento che avevo solo bisogno di due cifre (prendendo le ultime due cifre), una semplice charAtrisolto:

 // Obtaining the integer values of the char 1 and 2 in ASCII
 int semilastdigitASCII = number.charAt(number.length()-2);
 int lastdigitASCII = number.charAt(number.length()-1);

Avendo i codici, dobbiamo solo cercare il tavolo e apportare le modifiche necessarie:

 double semilastdigit = semilastdigitASCII - 48;  //A quick look, and -48 is the key
 double lastdigit = lastdigitASCII - 48;

Ora, perché raddoppiare? Bene, a causa di un passo davvero "strano". Attualmente abbiamo due doppi, 1 e 2, ma dobbiamo trasformarlo in 12, non ci sono operazioni matematiche che possiamo fare.

Dividiamo quest'ultimo (lastdigit) per 10 nel modo 2/10 = 0.2 (quindi perché doppio) in questo modo:

 lastdigit = lastdigit/10;

Questo è semplicemente giocare con i numeri. Stavamo trasformando l'ultima cifra in un decimale. Ma ora, guarda cosa succede:

 double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2

Senza entrare troppo in matematica, stiamo semplicemente isolando le unità di un numero. Vedete, dal momento che consideriamo solo 0-9, dividendo per un multiplo di 10 è come creare una "scatola" in cui archiviarla (ripensateci quando il vostro insegnante di prima elementare vi spiegò che unità erano e cento). Così:

 int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"

E tu ci vai. Hai trasformato una stringa di cifre (in questo caso, due cifre) in un numero intero composto da queste due cifre, considerando le seguenti limitazioni:

  • Nessun ciclo ripetitivo
  • Nessuna espressione "magica" come parseInt

38
2018-03-20 23:51



Una soluzione alternativa è da usare Apache Commons ' NumberUtils:

int num = NumberUtils.toInt("1234");

L'utilità Apache è piacevole perché se la stringa è un formato numerico non valido, viene sempre restituito 0. Quindi salvarti il ​​blocco catch try.

API Apache NumberUtils Versione 3.4


33
2017-08-27 12:07



Integer.decode

Puoi anche usare public static Integer decode(String nm) throws NumberFormatException.

Funziona anche per la base 8 e 16:

// base 10
Integer.parseInt("12");     // 12 - int
Integer.valueOf("12");      // 12 - Integer
Integer.decode("12");       // 12 - Integer
// base 8
// 10 (0,1,...,7,10,11,12)
Integer.parseInt("12", 8);  // 10 - int
Integer.valueOf("12", 8);   // 10 - Integer
Integer.decode("012");      // 10 - Integer
// base 16
// 18 (0,1,...,F,10,11,12)
Integer.parseInt("12",16);  // 18 - int
Integer.valueOf("12",16);   // 18 - Integer
Integer.decode("#12");      // 18 - Integer
Integer.decode("0x12");     // 18 - Integer
Integer.decode("0X12");     // 18 - Integer
// base 2
Integer.parseInt("11",2);   // 3 - int
Integer.valueOf("11",2);    // 3 - Integer

Se vuoi ottenere int invece di Integer Puoi usare:

  1. unboxing:

    int val = Integer.decode("12"); 
    
  2. intValue():

    Integer.decode("12").intValue();
    

27
2018-03-07 00:42



Ogni volta che c'è la minima possibilità che la stringa data non contenga un numero intero, devi gestire questo caso speciale. Purtroppo, i metodi standard di Java Integer::parseInt e Integer::valueOf lanciare a NumberFormatException per segnalare questo caso speciale. Pertanto, è necessario utilizzare le eccezioni per il controllo del flusso, che è generalmente considerato uno stile di codifica errato.

Secondo me, questo caso speciale dovrebbe essere gestito restituendo un Optional<Integer>. Poiché Java non offre un tale metodo, utilizzo il seguente wrapper:

private Optional<Integer> tryParseInteger(String string) {
    try {
        return Optional.of(Integer.valueOf(string));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

Uso:

// prints 1234
System.out.println(tryParseInteger("1234").orElse(-1));
// prints -1
System.out.println(tryParseInteger("foobar").orElse(-1));

Mentre questo utilizza ancora eccezioni per il controllo del flusso internamente, il codice di utilizzo diventa molto pulito.


20
2018-04-04 03:13