Pytanie Jak przekonwertować ciąg na int w Javie?


Jak mogę przekonwertować plik String do int w Javie?

Mój ciąg zawiera tylko liczby i chcę zwrócić liczbę, którą reprezentuje.

Na przykład, biorąc pod uwagę ciąg znaków "1234" wynikiem powinna być liczba 1234.


2520
2018-04-07 18:27


pochodzenie




Odpowiedzi:


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

Zobacz Dokumentacja Java po więcej informacji.


3558
2018-04-07 18:29



To rzuci NumberFormatException jeśli wejście nie jest prawidłową liczbą. - Francesco Menzani
Oprócz wychwytywania wyjątku NumberFormatException, użytkownik powinien także uważać na długość napisów, które przekazują; jeśli są wystarczająco długie, aby przepełnić liczbę całkowitą, mogą rozważyć użycie opcji Long :: parseLong. - Allison
@Allison, szczególnie jeśli używasz pola BIGINT w polu klucza podstawowego zwiększanego automatycznie PostgreSQL na przykład. O wiele bezpieczniejsze w użyciu - Letholdrus
Możesz sprawdzić, czy ciąg jest najpierw liczbą: stackoverflow.com/questions/1102891/... - JPRLCol
Ta metoda generuje również wyjątek, gdy łańcuch nie jest parsowalną liczbą całkowitą w podstawie 10. Użyj metody przeciążonej do pracy w innych bazach. na przykład Integer.parseInt ("1001", 8); dla podstawy 8. Źródło. - lokesh


Na przykład tutaj są dwa sposoby:

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

Istnieje niewielka różnica między tymi metodami:

  • valueOf zwraca nową lub buforowaną instancję java.lang.Integer
  • parseInt zwraca prymityw int.

To samo dotyczy wszystkich przypadków: Short.valueOf/parseShort, Long.valueOf/parseLongitp.


588
2018-04-07 18:36



Różnice między tymi dwoma metodami, patrz to pytanie - hertzsprung
valueOf metoda jest po prostu return valueOf(parseInt(string)); - Paul Verest


Cóż, bardzo ważnym punktem do rozważenia jest to, że parser Integer generuje wyjątek NumberFormatException, jak podano w 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.
}

Ważne jest, aby obsłużyć ten wyjątek podczas próby uzyskania wartości całkowitych z dzielonych argumentów lub dynamicznego analizowania.


215
2018-04-30 06:54



jak mogę parsować "26263Hello"? Chcę w tym przypadku wydobyć 26263 - user463035818
@ user463035818 - Zobacz docs.oracle.com/javase/8/docs/api/java/util/regex/... - regularny wzór wyrażania "([0-9]+)" "przechwyci" pierwszą sekwencję jednej lub więcej cyfr od jeden do dziewiątej. Spójrz na Matcher klasę w tym pakiecie. - Mark Stewart


Zrób to ręcznie:

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



Co jeśli wejście jest większe niż 2 ^ 32? Co się stanie, jeśli dane wejściowe zawierają znaki nieliczbowe? - yohm
Jedną z rzeczy, których programista musi nauczyć się na łączeniu siły roboczej, jeśli nie wcześniej, nigdy nie jest wymyślanie kół. To może być zabawne ćwiczenie, ale nie oczekuj, że Twój kod przejdzie weryfikację kodu, jeśli robisz tego rodzaju rzeczy w komercyjnych warunkach. - Dawood ibn Kareem
@yohm są to przypadki szczególne; możesz obsłużyć długie i niektóre regex; jednak do tego czasu możesz użyć parseInt. - Billz
-1 Przepraszam, ale jest to dość kiepski algorytm, z wieloma ograniczeniami, brakiem obsługi błędów i dziwnymi anomaliami (np. "" Daje wyjątek "-" wytworzy 0, a "+" wytworzy -5). Dlaczego ktokolwiek by to wybrał? Integer.parseInt(s)? - Rozumiem, że chodzi o to, że jest to pytanie do wywiadu, ale), co nie oznacza, że ​​zrobiłbyś to w ten sposób (o to pyta pytający), i b) ta odpowiedź i tak jest całkiem złym przykładem. - SusanW
Przypuszczam, że ta odpowiedź jest dla ciekawskich facetów ... - Timur Milovanov


Obecnie wykonuję zadanie na studia, w którym nie mogę używać pewnych wyrażeń, takich jak te powyżej, i patrząc na tabelę ASCII, udało mi się to zrobić. Jest to o wiele bardziej złożony kod, ale może pomóc innym, którzy są ograniczeni, tak jak ja.

Pierwszą rzeczą do zrobienia jest otrzymanie danych wejściowych, w tym przypadku ciągu cyfr; Zadzwonię do tego String numberiw tym przypadku zilustruję ją przy użyciu liczby 12 String number = "12";

Kolejnym ograniczeniem był fakt, że nie mogłem używać powtarzalnych cykli, dlatego też for cykl (który byłby idealny) również nie może być użyty. To nas trochę ogranicza, ale to jest cel. Ponieważ potrzebowałem tylko dwóch cyfr (biorąc dwie ostatnie cyfry), prostej charAtrozwiązałem to:

 // 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);

Mając kody, wystarczy spojrzeć na stół i dokonać niezbędnych korekt:

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

Dlaczego podwójne? Cóż, z powodu naprawdę "dziwnego" kroku. Obecnie mamy dwa podwójne, 1 i 2, ale musimy zmienić je na 12, nie ma żadnej operacji matematycznej, którą możemy wykonać.

Dzielimy to ostatnie (lastdigit) przez 10 w modzie 2/10 = 0.2 (dlatego dlaczego podwójne) w ten sposób:

 lastdigit = lastdigit/10;

To tylko gra liczbami. Ostatnią cyfrę obróciliśmy w dziesiątkę. Ale teraz spójrz na to, co się stanie:

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

Bez wchodzenia w matematykę, po prostu izolujemy jednostki cyframi liczby. Widzisz, ponieważ uważamy tylko 0-9, dzielenie przez wielokrotność 10 jest jak tworzenie "pudełka", w którym je przechowujesz (pomyśl, kiedy twój nauczyciel pierwszego stopnia wytłumaczył ci, czym jest jednostka i sto). Więc:

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

I proszę. Przekształciłeś ciąg cyfr (w tym przypadku dwie cyfry) w liczbę całkowitą złożoną z tych dwóch cyfr, biorąc pod uwagę następujące ograniczenia:

  • Bez powtarzających się cykli
  • Brak wyrażeń "magicznych", takich jak parsent

38
2018-03-20 23:51



Używanie typu double do parsowania liczby całkowitej jest nie tylko złym pomysłem pod względem wydajności. Wartości takie jak 0.2 są numerami okresowymi w reprezentacji zmiennoprzecinkowej i nie mogą być dokładnie odwzorowane. Wypróbuj System.out.println (0,1 + 0,2), aby zobaczyć punkt - wynik nie będzie 0.3! Lepiej trzymaj się kodu biblioteki, gdzie tylko możesz, w tym przypadku Integer.parseInt (). - ChrisB
Nie jest jasne, z jakim problemem ta odpowiedź próbuje rozwiązać, po pierwsze, dlaczego ktokolwiek powinien mieć to ograniczenie, które opisujesz, po drugie, dlaczego musisz spojrzeć na tabelę ASCII, jak możesz po prostu użyć '0' dla postaci zamiast 48 i nigdy nie będziesz musiał zawracać sobie głowy faktyczną wartością liczbową. Po trzecie cały objazd z double wartości nie mają żadnego sensu, ponieważ dzielisz przez dziesięć, aby potem pomnożyć je przez dziesięć. Rezultat jest po prostu semilastdigit * 10 + lastdigit jak nauczono w szkole podstawowej, kiedy wprowadzono system dziesiętny ... - Holger
@Holger Osobiście otrzymałem to ograniczenie przy pierwszym rozpoczynaniu programowania, a także kiedy musiałem pisać (pióro / papier) podobne interakcje w teście. Jest to rzadkość, ale jest to metoda, która jest łatwa do zrozumienia i choć nie jest najskuteczniejsza na przestrzeni wielu kilometrów, jest to metoda, która działa na tyle przyzwoicie dla małych projektów. SO.SE ma na celu pomóc każdemu, a nie tylko kilku. Dostarczyłem alternatywną metodę dla tych, którzy zaczynają od nauki tworzenia pseudo-algorytmu i przekształcania go w algorytm, zamiast używania gotowych wyrażeń java. Chociaż zapomniałem, że "0" jest fajne - Oak


Alternatywne rozwiązanie to użycie Apache Commons " NumberUtils:

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

Narzędzie Apache jest dobre, ponieważ jeśli łańcuch jest nieprawidłowym formatem liczbowym, zawsze zwracane jest 0. W ten sposób oszczędzasz blok try catch.

Apache NumberUtils API Wersja 3.4


33
2017-08-27 12:07



Kiedy parsujesz nieprawidłową liczbę, rzadko chcesz używać 0. - wnoise
Zero jest tym, co java używa jako domyślną, jeśli pole int obiektu nie jest ustawione. Pod tym względem ma to sens. - Ryboflavin
@Ryboflawina Nie, tak nie jest. Jednym z nich jest dobrze zdefiniowana semantyka językowa, a druga to wyjątek - etherous


Integer.decode

Możesz także użyć public static Integer decode(String nm) throws NumberFormatException.

Działa również dla podstaw 8 i 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

Jeśli chcesz dostać int zamiast Integer możesz użyć:

  1. Unboxing:

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

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

27
2018-03-07 00:42



Wreszcie! Ktoś, kto rzeczywiście zajmuje się publikowaniem wyników / wyników konwersji! Czy możesz dodać również znaki "-"? - not2qubit


Ilekroć istnieje najmniejsza możliwość, że dany Ciąg nie zawiera liczby całkowitej, musisz zająć się tym szczególnym przypadkiem. Niestety, standardowe metody Java Integer::parseInt i Integer::valueOf Rzuć NumberFormatException sygnalizować ten szczególny przypadek. Tak więc musisz używać wyjątków do kontroli przepływu, co jest ogólnie uważane za zły styl kodowania.

Moim zdaniem ten szczególny przypadek powinien być obsługiwany przez zwrot Optional<Integer>. Ponieważ Java nie oferuje takiej metody, używam następującego opakowania:

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

Stosowanie:

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

Mimo że wewnętrznie stosuje się wyjątki do kontroli przepływu, kod użycia staje się bardzo czysty.


20
2018-04-04 03:13





Konwertowanie ciągu znaków na int jest bardziej skomplikowane niż przekształcenie liczby. Zastanowiłeś się nad następującymi problemami:

  • Czy ciąg zawiera tylko liczby 0-9?
  • co słychać u - / + przed lub po ciągu? Czy to możliwe (w odniesieniu do numerów rozliczeniowych)?
  • co słychać u MAX _- / MIN_INFINITY? Co się stanie, jeśli ciąg znaków to 99999999999999999999? Czy maszyna traktuje ten ciąg jako int?

19
2017-10-20 13:18



Tak - i mamy nieprzyjemną skrzynkę krawędzi około -2 ^ 31. Jeśli spróbujesz zanegować 2 ^ 31, możesz napotkać trudności ...... - SusanW