Jak mogę przekonwertować String
na int
Java w Java?
Mój ciąg zawiera tylko liczby i chcę zwrócić liczbę, którą reprezentuje.
Na przykład, biorąc pod uwagę ciąg, "1234"
wynikiem powinna być liczba 1234
.
java
string
int
type-conversion
Nieznany użytkownik
źródło
źródło
Odpowiedzi:
Jeśli spojrzysz na dokumentację Java , zauważysz, że „catch” polega na tym, że ta funkcja może rzucać a
NumberFormatException
, co oczywiście musisz obsługiwać:(Domyślnie ten zabieg ma zniekształcony numer
0
, ale możesz zrobić coś innego, jeśli chcesz).Alternatywnie możesz użyć
Ints
metody z biblioteki Guava, która w połączeniu z Javą 8Optional
zapewnia potężny i zwięzły sposób konwersji łańcucha na int:źródło
int foo = NumberUtils.toInt(myString, 0);
Oto na przykład dwa sposoby:
Istnieje niewielka różnica między tymi metodami:
valueOf
zwraca nową lub buforowaną instancjęjava.lang.Integer
parseInt
zwraca prymitywneint
.To samo dotyczy wszystkich przypadków:
Short.valueOf
/parseShort
,Long.valueOf
/parseLong
itd.źródło
valueOf
metoda jest po prostureturn valueOf(parseInt(string));
valueOf
nazywa się rekurencyjnie?valueOf(String)
jest implementowany przez parsowanie String do int za pomocą,parseInt(String)
a następnie zawijanie int w Integer za pomocąvalueOf(int)
. Nie rekurencji tutaj, bovalueOf(String)
ivalueOf(int)
to dwie zupełnie różne funkcje, nawet jeśli mają taką samą nazwę.Cóż, bardzo ważnym punktem do rozważenia jest to, że parser liczb całkowitych zgłasza NumberFormatException, jak stwierdzono w Javadoc .
Ważne jest, aby obsłużyć ten wyjątek podczas próby uzyskania wartości całkowitych z podzielonych argumentów lub dynamicznego analizowania czegoś.
źródło
"([0-9]+)"
„przechwyci” pierwszą sekwencję jednej lub więcej cyfr od jednego do dziewięciu. Spójrz naMatcher
klasę w tym pakiecie.Zrób to ręcznie:
źródło
Integer.parseInt(s)
? - Widzę sens tego pytania jako wywiadu, ale a) to nie oznacza, że zrobiłbyś to w ten sposób (o to pytał pytający), i b) i tak odpowiedź jest dość złym przykładem.Integer.parseInt
ponieważ nie sprawdza poprawności.Alternatywnym rozwiązaniem jest użycie NumberUtils Apache Commons :
Narzędzie Apache jest dobre, ponieważ jeśli łańcuch ma nieprawidłowy format liczb, wówczas zawsze zwracane jest 0. W ten sposób oszczędzasz ci try catch catch.
Apache NumberUtils API Version 3.4
źródło
Obecnie wykonuję zadanie na studia, gdzie nie mogę używać niektórych wyrażeń, takich jak powyższe, 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ę
String number
, a w tym przypadku zilustruję to za pomocą liczby 12String number = "12";
Kolejnym ograniczeniem był fakt, że nie mogłem używać powtarzalnych cykli, dlatego też nie można użyć
for
cyklu (który byłby idealny). To nas ogranicza, ale z drugiej strony taki jest cel. Ponieważ potrzebowałem tylko dwóch cyfr (biorąc dwie ostatnie cyfry), prostycharAt
to rozwiązał:Mając kody, wystarczy spojrzeć na tabelę i dokonać niezbędnych zmian:
Dlaczego podwójny? Cóż, z powodu naprawdę „dziwnego” kroku. Obecnie mamy dwa podwójne, 1 i 2, ale musimy je zmienić na 12, nie możemy wykonać żadnej operacji matematycznej.
Dzielimy ten ostatni (lastdigit) przez 10 w sposób
2/10 = 0.2
(stąd podwójny) w następujący sposób:To tylko zabawa z liczbami. Zamienialiśmy ostatnią cyfrę na dziesiętną. Ale teraz spójrz na to, co się dzieje:
Nie wchodząc zbytnio w matematykę, po prostu izolujemy jednostki od cyfr liczby. Widzicie, ponieważ rozważamy tylko 0-9, dzielenie przez wielokrotność 10 jest jak tworzenie „pudełka”, w którym je przechowujesz (pomyśl o tym, kiedy twój nauczyciel pierwszej klasy wyjaśnił ci, czym była jednostka i sto). Więc:
I proszę bardzo. 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:
źródło
'0'
dla postaci zamiast48
i nigdy nie musisz przeszkadza jej faktyczna wartość liczbowa. Po trzecie, cały objazd zdouble
wartościami nie ma żadnego sensu, ponieważ dzielisz przez dziesięć, aby po prostu pomnożyć przez dziesięć. Rezultat jest po prostu taki,semilastdigit * 10 + lastdigit
jak w szkole podstawowej, kiedy wprowadzono system dziesiętny…semilastdigit
ilastdigit
. Jak kodowałbyś swoje rozwiązanie, aby uniknąć „powtarzających się cykli”, gdybym podał ci prawidłowy ciąg liczbowy o dowolnej długości (tj. Dowolna wartość między „-2147483648” a „2147483647”?)Integer.decode
Możesz także użyć
public static Integer decode(String nm) throws NumberFormatException
.Działa również dla bazy 8 i 16:
Jeśli chcesz
int
zamiast tegoInteger
możesz użyć:Rozpakowanie:
intValue()
:źródło
Ilekroć istnieje najmniejsza możliwość, że dany Ciąg nie zawiera liczby całkowitej, musisz poradzić sobie z tym szczególnym przypadkiem. Niestety, standardowe metody Java
Integer::parseInt
iInteger::valueOf
wrzuć a,NumberFormatException
aby zasygnalizować ten szczególny przypadek. Dlatego musisz użyć 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 zostać rozwiązany poprzez zwrócenie pustego
Optional<Integer>
. Ponieważ Java nie oferuje takiej metody, używam następującego opakowania:Przykładowe użycie:
Mimo że nadal korzysta się wewnętrznie z wyjątków do kontroli przepływu, kod użycia staje się bardzo czysty. Ponadto można wyraźnie rozróżnić przypadek, w którym
-1
jest analizowany jako poprawna wartość, oraz przypadek, w którym nie można przeanalizować niepoprawnego ciągu znaków.źródło
Konwersja ciągu na liczbę int jest bardziej skomplikowana niż zwykła konwersja liczby. Zastanawiasz się nad następującymi kwestiami:
źródło
Metody, aby to zrobić:
Integer.valueOf tworzy obiekt Integer, wszystkie inne metody - pierwotne int.
Ostatnie 2 metody z commons-lang3 i duży artykuł na temat konwersji tutaj .
źródło
Możemy użyć
parseInt(String str)
metodyInteger
klasy opakowania do konwersji wartości String na wartość całkowitą.Na przykład:
Integer
Klasa zapewnia równieżvalueOf(String str)
metodę:Możemy również skorzystać
toInt(String strValue)
z NumberUtils Utility klasy do konwersji:źródło
Zastosowanie
Integer.parseInt(yourString)
.Pamiętaj o następujących rzeczach:
Integer.parseInt("1");
// okInteger.parseInt("-1");
// okInteger.parseInt("+1");
// okInteger.parseInt(" 1");
// Wyjątek (puste miejsce)Integer.parseInt("2147483648");
// Wyjątek (liczba całkowita jest ograniczona do maksymalnej wartości 2 147 483 647)Integer.parseInt("1.1");
// Wyjątek ( . Lub , lub cokolwiek nie jest dozwolone)Integer.parseInt("");
// Wyjątek (nie 0 czy coś)Istnieje tylko jeden rodzaj wyjątku:
NumberFormatException
źródło
Mam rozwiązanie, ale nie wiem, jak skuteczne jest. Ale działa dobrze i myślę, że można to poprawić. Z drugiej strony wykonałem kilka testów z JUnit, które krok poprawnie. Dołączyłem funkcję i testowanie:
Testowanie za pomocą JUnit:
źródło
(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
Google Guava ma tryParse (ciąg) , który zwraca,
null
jeśli ciąg nie może zostać przeanalizowany, na przykład:źródło
Możesz także rozpocząć od usunięcia wszystkich znaków nienumerycznych, a następnie przeanalizowania liczby całkowitej:
Ale ostrzegam, że działa to tylko dla liczb nieujemnych.
źródło
-42
zostanie przeanalizowany jako42
."4+2"
,42
w rezultacie uzyskam bez żadnej wskazówki, że to, co próbowałem zrobić, było błędne. Użytkownik będzie miał wrażenie, że wprowadzenie podstawowych wyrażeń, takich jak4+2
prawidłowe wprowadzanie, ale aplikacja kontynuuje z nieprawidłową wartością. Poza tym typemString
nie jeststring
…Oprócz poprzednich odpowiedzi chciałbym dodać kilka funkcji. Oto wyniki podczas ich używania:
Realizacja:
źródło
Jak wspomniano, Apache Commons
NumberUtils
może to zrobić. Zwraca,0
jeśli nie może przekonwertować ciągu na wartość int.Możesz także zdefiniować własną wartość domyślną:
Przykład:
źródło
Możesz użyć tego kodu również z pewnymi środkami ostrożności.
Opcja nr 1: jawnie obsłuż wyjątek, na przykład wyświetlając okno dialogowe komunikatu, a następnie zatrzymaj wykonywanie bieżącego przepływu pracy. Na przykład:
Opcja # 2: Zresetuj zmienną, której dotyczy problem, jeśli przepływ wykonania może być kontynuowany w przypadku wyjątku. Na przykład z pewnymi modyfikacjami w bloku catch
Użycie stałej łańcuchowej do porównania lub innego rodzaju obliczeń jest zawsze dobrym pomysłem, ponieważ stała nigdy nie zwraca wartości zerowej.
źródło
JOptionPane.showMessageDialog()
odpowiedzi na waniliowe pytanie Java nie ma sensu.Integer.valueOf(String);
nie zwraca typuint
.Możesz użyć
new Scanner("1244").nextInt()
. Lub zapytaj, czy istnieje nawet int:new Scanner("1244").hasNextInt()
źródło
W konkursach programistycznych, w których masz pewność, że liczba będzie zawsze prawidłową liczbą całkowitą, możesz napisać własną metodę do analizy danych wejściowych. Spowoduje to pominięcie całego kodu związanego z walidacją (ponieważ tego nie potrzebujesz) i będzie nieco bardziej wydajne.
Dla prawidłowej dodatniej liczby całkowitej:
Dla liczb całkowitych dodatnich i ujemnych:
Jeśli spodziewasz się spacji przed tymi liczbami lub po nich, pamiętaj, aby zrobić to
str = str.trim()
przed dalszym przetwarzaniem.źródło
Po prostu możesz spróbować:
Integer.parseInt(your_string);
aby przekonwertowaćString
naint
Double.parseDouble(your_string);
aby przekonwertowaćString
nadouble
Przykład
źródło
Do normalnego ciągu możesz użyć:
W przypadku konstruktora ciągów i bufora ciągów można użyć:
źródło
Upewnij się, że w łańcuchu nie ma danych nienumerycznych.
źródło
Jestem trochę zaskoczony, że nikt nie wspomniał o konstruktorze liczb całkowitych, który przyjmuje parametr String jako parametr.
Oto on:
Java 8 - liczba całkowita (ciąg) .
Oczywiście konstruktor zwróci typ
Integer
, a operacja rozpakowania konwertuje wartość naint
.Należy wspomnieć : ten konstruktor wywołuje
parseInt
metodę.źródło
Użyj Integer.parseInt () i umieść go w
try...catch
bloku, aby obsłużyć wszelkie błędy na wypadek wprowadzenia znaku nienumerycznego, na przykładźródło
No to ruszamy
źródło
Można to zrobić na siedem sposobów:
1) Używając
Ints.tryParse
:2) Używając
NumberUtils.createInteger
:3) Używając
NumberUtils.toInt
:4) Używając
Integer.valueOf
:5) Używając
Integer.parseInt
:6) Używanie
Integer.decode
:7) Używanie
Integer.parseUnsignedInt
:źródło
Jedną z metod jest parseInt (String). Zwraca prymitywną int:
Druga metoda to valueOf (String) i zwraca nowy obiekt Integer ():
źródło
Możesz użyć dowolnego z poniższych:
Integer.parseInt(s)
Integer.parseInt(s, radix)
Integer.parseInt(s, beginIndex, endIndex, radix)
Integer.parseUnsignedInt(s)
Integer.parseUnsignedInt(s, radix)
Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
Integer.valueOf(s)
Integer.valueOf(s, radix)
Integer.decode(s)
NumberUtils.toInt(s)
NumberUtils.toInt(s, defaultValue)
źródło
Jest to kompletny program ze wszystkimi dodatnimi i ujemnymi warunkami bez korzystania z biblioteki
źródło
Integer.parseInt
.