Soru Java'da bir dizeye nasıl bir String dönüştürürüm?


Nasıl dönüştürebilirim String bir int Java'da?

Dizgimde yalnızca sayılar var ve temsil ettiği numarayı geri getirmek istiyorum.

Örneğin, dize verildi "1234" sonuç sayı olmalı 1234.


2520
2018-04-07 18:27


Menşei




Cevaplar:


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

Bakın Java Belgeleri daha fazla bilgi için.


3558
2018-04-07 18:29



Bu fırlatacak NumberFormatException giriş geçerli bir sayı değilse. - Francesco Menzani
Bir NumberFormatException yakalamaya ek olarak, kullanıcı, ilettikleri dizelerin uzunluğuna da dikkat etmelidir; Bir tamsayı taşacak kadar uzunsa, yerine Long :: parseLong kullanmayı düşünebilirler. - Allison
@Allison, özellikle PostgreSQL otomatik artırılmış birincil anahtar alanında BIGINT alanı kullanılıyorsa. Uzun kullanmak için çok daha güvenli - Letholdrus
Dizenin ilk sayı olup olmadığını kontrol edebilirsiniz. stackoverflow.com/questions/1102891/... - JPRLCol
Bu yöntem ayrıca, dize, 10. adımda ayrıştırılabilir bir tamsayı olmadığında istisna atar. Diğer üslerde çalışmak için aşırı yüklü yöntem kullanın. Örneğin. Integer.parseInt ("1001", 8); taban 8 için. Kaynak. - lokesh


Örneğin, burada iki yol vardır:

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

Bu yöntemler arasında küçük bir fark vardır:

  • valueOf yeni veya önbelleğe alınmış bir örneğini döndürür java.lang.Integer
  • parseInt ilkel değerini döndürür int.

Her şey aynı şeydir: Short.valueOf/parseShort, Long.valueOf/parseLong, vb.


588
2018-04-07 18:36



İki yöntem arasındaki farklar için bkz. bu soru - hertzsprung
valueOf yöntem sadece return valueOf(parseInt(string)); - Paul Verest


Göz önünde bulundurulması gereken çok önemli bir nokta, Tamsayı ayrıştırıcısının NumberFormatException'ı belirtilen şekilde atar. 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.
}

Bölünmüş argümanlardan tamsayı değerleri almaya çalışırken veya bir şeyi dinamik olarak ayrıştırırken bu özel durumun üstesinden gelmek önemlidir.


215
2018-04-30 06:54



"26263Hello" yu nasıl ayrıştırabilirim? Bu durumda 26263 çıkarmak istiyorum - user463035818
@ user463035818 - Gör docs.oracle.com/javase/8/docs/api/java/util/regex/... - düzenli bir ifade deseni "([0-9]+)" Bir ya da daha fazla basamağın ilk dizisini dokuzdan birinciye "yakalar". Bak Matcher Bu pakette sınıf. - Mark Stewart


Manuel olarak yap:

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



Giriş 2 ^ 32'den büyükse ne olur? Girdi sayısal olmayan karakterler içeriyorsa ne olur? - yohm
Bir programcının iş gücüne katılmayı öğrenmesi gereken şeylerden biri, daha önce olmasa bile, tekerlekleri yeniden icat etmemesidir. Bu eğlenceli bir egzersiz olabilir, ancak ticari bir ortamda böyle bir şey yaparsanız kodunuzun kod incelemesi yapmasını beklemeyin. - Dawood ibn Kareem
@yohm bunlar özel durumdur; uzun ve bazı düzenli ifadelerle başa çıkabilir; Ancak, o zaman parseInt kullanabilirsiniz. - Billz
-1 Üzgünüz, ancak bu bir çok kısıtlama, hata işleme ve bazı garip anormalliklerle birlikte oldukça zayıf bir algoritmadır (örneğin "bir istisna verir" - "0 üretecek ve" + "-5 üretecektir). Bunu neden kimse seçsin ki? Integer.parseInt(s)? - Bunun bir röportaj sorusu olduğuna dair bir nokta görüyorum, fakat a) bu şekilde yaptığınızı ima etmiyorsunuz (ki bu da soruyu sordu), ve b) bu ​​cevap zaten çok kötü bir örnek. - SusanW
Sanırım bu cevap meraklı arkadaşlar için. - Timur Milovanov


Şu anda kolej için bir ödev yapıyorum, yukarıdaki gibi bazı ifadeleri kullanamıyorum ve ASCII tablosuna bakarak bunu yapmayı başardım. Bu çok daha karmaşık bir koddur, ama benim gibi kısıtlanmış olan diğerlerine yardım edebilir.

Yapılacak ilk şey, girişi, bu durumda, bir rakam dizisi almaktır; Ben arayacağım String numberve bu durumda, 12 sayısını kullanarak örnek vereceğim, String number = "12";

Bir başka sınırlama, tekrarlayan döngüleri kullanamadığım gerçeğiydi. for (mükemmel olurdu) döngüsü de kullanılamaz. Bu bizi biraz sınırlıyor, ama sonra tekrar, bu hedef. Sadece iki haneye ihtiyacım olduğu için (son iki rakamı alarak) charAtçözüldü:

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

Kodlara sahip olmak için, sadece tabloya bakmamız ve gerekli ayarlamaları yapmamız gerekiyor:

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

Şimdi, neden çift? Şey, gerçekten "tuhaf" bir adım. Şu anda iki ve 1 iki kişilik var, ama 12'ye çevirmemiz gerekiyor, yapabileceğimiz herhangi bir matematiksel işlem yok.

Sonuncuyu (lastdigit) 10'a böleriz 2/10 = 0.2 (bu nedenle neden çift) böyle:

 lastdigit = lastdigit/10;

Bu sadece sayılarla oynuyor. Son basamağı bir ondalığa dönüştürüyorduk. Ama şimdi, ne olduğuna bak:

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

Matematiğe fazla girmeden, birimleri bir sayının rakamlarını ayırıyoruz. Görüyorsunuz, sadece 0-9'u dikkate aldığımızdan, 10'un katına bölünerek bir "kutu" oluşturmak gibi bir şey yaratıyorsunuz (birinci sınıf öğretmeniniz size bir birimin ve bir yüzün ne olduğunu açıkladığında tekrar düşünün). Yani:

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

Ve işte gidiyorsun. Aşağıdaki sınırlamaları göz önünde bulundurarak, bu iki basamaktan oluşan bir tam sayıya (bu durumda iki basamaklı) bir Dize döndürdünüz:

  • Tekrarlanan döngü yok
  • ParseInt gibi "Magic" ifadeleri yok

38
2018-03-20 23:51



Bir tamsayı ayrıştırmak için yazım çiftini kullanmak yalnızca performans açısından kötü bir fikir değildir. 0.2 gibi değerler, kayan noktalı gösterimde periyodik sayılardır ve tam olarak gösterilemez. Noktayı görmek için System.out.println (0.1 + 0.2) 'i deneyin - sonuç 0.3 olmayacak! Bu durumda Integer.parseInt (), nerede olursanız olun, kütüphane kodu ile daha iyi sopa. - ChrisB
Bu cevabın ne tür bir problem çözmeye çalıştığı net değildir, ilk olarak, neden tarif ettiğin bu kısıtlamaya sahip olmalı, ikincisi, neden sadece ASCII tablosuna bakmak zorundasınız? '0' karakter yerine 48 ve gerçek sayısal değeriyle uğraşmak zorunda kalmazlar. Üçüncü olarak, tüm dolambaçlı double değerler on ile bölünürken hiçbir şey ifade etmez, ondan sonra on ile çarpmak için. Sonuç sadece semilastdigit * 10 + lastdigit İlkokulda öğrenildiği gibi, ondalık sistem tanıtıldığı zaman… - Holger
@Holger Programlamaya ilk başlandığında ve ayrıca bir testte (kalem / kâğıt) benzer etkileşimleri yazmam gerektiğinde bu kısıtlama şahsen verildi. Bu nadirdir, ancak kolayca anlaşılan ve kilometrelerce en verimli olmamakla birlikte, küçük projeler için yeterince iyi çalışan bir yöntemdir. SO.SE sadece birkaç kişiye değil, herkese yardım etmek içindir. Premade java ifadeleri kullanmak yerine, bir yalancı algoritmanın nasıl oluşturulacağını ve bir algoritmaya dönüştürüleceğini öğrenerek başlayanlara alternatif bir yöntem sundum. Her ne kadar unutmuşsam da '0' havalı - Oak


Alternatif bir çözüm kullanmaktır Apache Commons NumberUtils:

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

Apache yardımcı programı güzeldir çünkü dize geçersiz bir sayı biçimindeyse, 0 her zaman döndürülür. Bu sayede, try catch bloğu kaydedilir.

Apache NumberUtils API Sürüm 3.4


33
2017-08-27 12:07



Geçersiz bir sayı ayrıştırıldığında nadiren 0'ın kullanılmasını istersiniz. - wnoise
Sıfır, bir nesnede bir int alanı ayarlanmamışsa java'nın varsayılan olarak kullandığıdır. Yani bu açıdan mantıklı. - Ryboflavin
@Ryboflavin Hayır, öyle değil. Bunlardan biri iyi tanımlanmış bir dil semantik ve diğeri bir istisnadır - etherous


Integer.decode

Ayrıca kullanabilirsiniz public static Integer decode(String nm) throws NumberFormatException.

Ayrıca 8 ve 16 tabanı için de çalışır:

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

Eğer almak istiyorsan int yerine Integer kullanabilirsiniz:

  1. Kutudan Çıkarma:

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

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

27
2018-03-07 00:42



En sonunda! Dönüşümlerin sonuçlarını / çıktılarını yayınlamaktan gerçekten rahatsız olan biri! "-" işaretleriyle de ekleyebilir misiniz? - not2qubit


Verilen String'in bir Tamsayı içermediği en ufak bir ihtimal olduğunda, bu özel durumu ele almanız gerekir. Ne yazık ki standart Java yöntemleri Integer::parseInt ve Integer::valueOf atmak NumberFormatException Bu özel durumu işaret etmek için. Bu nedenle, genellikle kötü kodlama stili olarak kabul edilen akış kontrolü için istisnalar kullanmanız gerekir.

Benim düşünceme göre, bu özel durum geri dönerek ele alınmalıdır. Optional<Integer>. Java böyle bir yöntem sunmadığından, şu sarmayı kullanıyorum:

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

Kullanımı:

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

Bu hala iç akış kontrolü için istisnalar kullanırken, kullanım kodu çok temiz hale gelir.


20
2018-04-04 03:13