Bir dizgiyi Groovy'de int'e dönüştürme


286

Ben Stringbir tamsayı değeri temsil eden ve bir dönüştürmek istiyorum bir var int. Java'ların harika bir eşdeğeri var Integer.parseInt(String)mı?


1
neden sadece def anahtar sözcüğünü kullanmıyorsunuz?
Omnipresent

4
Bir tamsayı içeren bir dize parametresi var. Daha sonra bir int olarak i kullanırsam def i = string_parameter kullanılması sınıf cast istisnasına neden olur.
Steve Kuo

Yanıtlar:


492

Kullan toInteger()bir dönüştürme yöntemi Stringbir etmek Integer, mesela

int value = "99".toInteger()

Kullanımdan kaldırılmış bir yöntem kullanmaktan kaçınan bir alternatif (aşağıya bakın)

int value = "66" as Integer

Eğer olup olmadığını kontrol etmek gerekirse String olabilir dönüşüm, kullanım gerçekleştirmeden önce dönüştürülecek

String number = "66"

if (number.isInteger()) {
  int value = number as Integer
}

Kullanımdan Kaldırma Güncellemesi

Groovy'nin son sürümlerinde toInteger()yöntemlerden biri kullanımdan kaldırıldı. Aşağıdakiler org.codehaus.groovy.runtime.StringGroovyMethodsGroovy 2.4.4'ten alınmıştır.

/**
 * Parse a CharSequence into an Integer
 *
 * @param self a CharSequence
 * @return an Integer
 * @since 1.8.2
 */
public static Integer toInteger(CharSequence self) {
    return Integer.valueOf(self.toString().trim());
}

/**
 * @deprecated Use the CharSequence version
 * @see #toInteger(CharSequence)
 */
@Deprecated
public static Integer toInteger(String self) {
    return toInteger((CharSequence) self);
}

Yöntemin kullanımdan kaldırılmış sürümünün, aşağıdaki gibi korkunç bir şey kullanarak çağrılmasını sağlayabilirsiniz:

int num = ((CharSequence) "66").toInteger()

Şahsen ben çok tercih ederim:

int num = 66 as Integer

19
Uyarı emptor: değeri isInteger()önce kontrol etmeniz gerekir , çünkü toInteger()dize sayısal değilse bir istisna atar. Aynı durum toFloat()/isFloat()
Andres Kievsky

8
In 2.1.6 API belgelerine Tamsayımı / toInteger kaldırılıyor. Bunu yapmanın en iyi yolu nedir?
pakman

1
Tamsayı paramValue = params.int ('paramName') kullanmak yine de güvenli değildir. Param haritasında "paramName" adında bir param yoksa, int'e null değeri atamadığınız konusunda bir istisna alırsınız.
Michael

2
sadece Groovy 1.8 intolduğundan beri eklemek istedim int. Groovy, boks nedeniyle hala Integer sınıfını görüntüler, ancak örneğin 1.0'da mümkün olan nullbir a atayamazsınız int. Null türünde bir yöntem çağrısı parametresi için argüman olarak zaten null kullanamadığınızdan, değişikliğin kritik olmadığını düşündük int. Tüm bunlar Java'dan hala farklıdır, çünkü Java'da Basit bir atamayla Integer'ı Long'a dönüştüremez veya Long ile int alma yöntemini çağıramazsınız.
blackdrag

1
@pakman StringGroovyMethods.isInteger(String)ve DefaultGroovyMethods.isInteger(CharSequence)lehine itiraz edildi StringGroovyMethods.isInteger(CharSequence). Aynı şey geçerli toInteger().
bmaupin

67

Bunu yapmanın birkaç yolu, bu benim favorim:

def number = '123' as int

10
Yukarıdaki ile aynı sorun, dize bir sayı değilse bu bir istisna atar. isInteger()Önce kontrol edin .
Andres Kievsky

12
@ank bir eşdeğer için sorulan soru Integer.parseInt(String)da dize bir sayı değilse bir İstisna atar, bu yüzden soru göz önüne alındığında, bu bir "sorun" olarak
düşünmüyorum

30

Bir ek sözleşme olarak Don'un cevap , harika bir eklese sadece .toInteger()yöntemini Strings, aynı zamanda ekler toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(), toList(), ve toLong().

Aynı şekilde, harika da ekler is*dönüş olanların tümüne tağşişi trueeğer Stringsöz konusu söz konusu biçime çözümlenebilir.

İlgili GDK sayfası burada.


8
Bu doğru cevaptır - önce kontrol edin isInteger(), sonra yapın toInteger()... yani, try/ catchbloğu eklemeyi tercih etmiyorsanız :) ama bunun için istisnalar kullanmak kötü bir fikirdir.
Andres Kievsky

2
@anktastic Cevabımın daha doğru olduğunu savunuyorum çünkü soru "Java'nın Integer.parseInt (String) 'in harika bir eşdeğerini, yani denetlenmeyen bir dönüşümü
istedi

25

Groovy'nin son sürümlerinde tanıtıldığından emin değilim (ilk cevap oldukça eski), ancak şimdi kullanabilirsiniz:

def num = mystring?.isInteger() ? mystring.toInteger() : null

veya

def num = mystring?.isFloat() ? mystring.toFloat() : null

Sağlanan dize güvenilir değilse, tamsayılar yerine şamandıralar veya çiftler kullanmanızı öneririm.


2
+1 en iyi çözüm IMO, dönüşümden önce tür kontrolüne ek olarak boş kontrol içerir
kaskelotti

Doğal olarak yanlış oldukları için şamandıralar veya çiftler kullanmaya karşı öneriyorum. Groovy, BigDecimals'i diğer herhangi bir Sayı kadar kolay hale getirdiğinden, bir Tamsayıdan daha fazla doğruluğa ihtiyacınız varsa, bunu kullanın. İkincisi, bu yaklaşım güvenli görünüyor, ancak sonuç bu num == null olabilir, bu yüzden buna dikkat etmelisiniz
Hans Bogaards

İlk örnek kod için sanırım mystring.toInteger()bunun yerine yazmak istediniz mystring.toFloat(). Yani def num = mystring?.isInteger() ? mystring.toInteger() : nulldoğru olacaktır.
Sk8erPeter

15

Groovy Java formunu gayet iyi kabul ediyor. Eğer bir Groovier yolu olup olmadığını soruyorsanız, gidilecek bir yol var Integer.

Her ikisi de burada gösterilir:

String s = "99"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i

5
Bu cevap dize sayısal olmadığında da atar - dikkat edin!
Andres Kievsky

6

ayrıca statik ithalat yapabilirsiniz

import static java.lang.Integer.parseInt as asInteger

ve bu kullanımdan sonra

String s = "99"
asInteger(s)

Düzgün, küçük şeyleri çok unutuyorum.
Sihirli Ahtapot Urn


2

Bunu başarmanın birkaç yolu. Örnekler aşağıdaki gibidir

a. return "22".toInteger()
b. if("22".isInteger()) return "22".toInteger()
c. return "22" as Integer()
d. return Integer.parseInt("22")

Bu yardımcı olur umarım


1
Bu, mevcut 8 cevapta henüz bulunmayan soruya nasıl bir şey ekliyor?
LukeG

Benim kötü, burada biraz açgözlü var
Darth Shekhar

1

Mükemmel Stil dönüşümü:

Integer num = '589' as Integer

İstek parametreniz varsa:

Integer age = params.int('age')



0

Kullanım şekli hala toInteger () olmalıdır, çünkü gerçekten kullanımdan kaldırılmamıştır.

int value = '99'.toInteger()

Dize sürümü kullanımdan kaldırıldı, ancak CharSequence, bir Dizenin uyguladığı bir Arabirimdir. Bu nedenle, bir dize kullanmak tamamdır, çünkü yöntem yalnızca CharSequence ile çalıştığında bile kodunuz çalışmaya devam eder. Aynı şey isInteger () için de geçerli

Başvuru için bu soruya bakın: Bir String'i CharSequence'a nasıl dönüştürebilirim?

Ben yorumladım, çünkü bu yönteme itiraz kavramı beni şaşırttı ve diğer insanlar için bundan kaçınmak istiyorum.


-1

Harika bir dize tamsayı bir dize dönüştürme basit yolu aşağıdaki gibidir ...

String aa="25"
int i= aa.toInteger()

Şimdi "i" Tamsayı Değerine Sahiptir.


4
Bu mevcut cevaplara ne katıyor? 9 yıl önce gönderilen kabul edilen cevap şununla başlar: " toInteger()Dönüştürmek için yöntemi kullanın ...
varsayılan yerel ayar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.