การแปลงสตริงเป็น int ใน Groovy


286

ฉันมีที่แสดงถึงค่าจำนวนเต็มและต้องการที่จะแปลงเป็นString intมีค่าเทียบเท่าของจาวาของ Java Integer.parseInt(String)หรือไม่?


1
ทำไมไม่ใช้คำหลัก def เท่านั้น
อยู่ทั่วไปทุกหนทุกแห่ง

4
ฉันมีพารามิเตอร์สตริงที่มีจำนวนเต็ม การใช้ def i = string_parameter ส่งผลให้เกิดข้อยกเว้นในการส่งคลาสหากฉันใช้ i เป็น int ในภายหลัง
Steve Kuo

คำตอบ:


492

ใช้toInteger()วิธีการแปลง a Stringเป็นIntegerเช่น

int value = "99".toInteger()

ทางเลือกอื่นซึ่งหลีกเลี่ยงการใช้วิธีการที่เลิกใช้แล้ว (ดูด้านล่าง) คือ

int value = "66" as Integer

หากคุณต้องการตรวจสอบว่าString สามารถแปลงก่อนดำเนินการแปลงใช้

String number = "66"

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

การปรับปรุงการเลิกใช้

ใน Groovy เวอร์ชันล่าสุด toInteger()วิธีการวิธีหนึ่งถูกเลิกใช้แล้ว ข้อมูลต่อไปนี้นำมาจากorg.codehaus.groovy.runtime.StringGroovyMethodsใน Groovy 2.4.4

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

คุณสามารถบังคับให้มีการเรียกเมธอดเวอร์ชันที่ไม่คัดค้านโดยใช้สิ่งที่น่ากลัวเช่น:

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

โดยส่วนตัวแล้วฉันชอบ:

int num = 66 as Integer

19
Caveat emptor: คุณต้องตรวจสอบค่าisInteger()ก่อนเพราะtoInteger()จะทำให้เกิดข้อยกเว้นถ้าสตริงไม่ได้เป็นตัวเลข ใช้กับtoFloat()/isFloat()
Andres Kievsky

8
ในเอกสาร 2.1.6 api isInteger / toInteger ถูกคัดค้าน แล้ววิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?
pakman

1
การใช้ Integer paramValue = params.int ('paramName') นั้นไม่ปลอดภัยเลย หากไม่มีพารามิเตอร์ที่มีชื่อ "paramName" ในแผนที่ Param คุณจะได้รับการยกเว้นว่าไม่สามารถแปลงค่าว่างเป็น int ได้
Michael

2
แค่อยากจะเพิ่มว่าตั้งแต่ Groovy 1.8 แน่นอนint intGroovy จะยังคงแสดงคลาส Integer เนื่องจากการชกมวย แต่คุณจะไม่สามารถกำหนดให้nullกับintซึ่งเป็นไปได้ใน 1.0 เราถือว่าการเปลี่ยนแปลงนั้นไม่สำคัญเนื่องจากคุณไม่สามารถใช้ null เป็นอาร์กิวเมนต์สำหรับพารามิเตอร์การเรียกเมธอดเป็นประเภทintได้ ทั้งหมดนี้ยังคงแตกต่างจาก Java เช่นเดียวกับใน Java คุณไม่สามารถแปลงจำนวนเต็มเป็น Long ได้โดยการมอบหมายอย่างง่ายหรือเรียกวิธีการรับค่า int ด้วย Long
blackdrag

1
@pakman StringGroovyMethods.isInteger(String)และจะเลิกในความโปรดปรานของDefaultGroovyMethods.isInteger(CharSequence) เดียวกันจะไปสำหรับStringGroovyMethods.isInteger(CharSequence) toInteger()
bmaupin

67

มีหลายวิธีที่จะทำสิ่งนี้สิ่งที่ฉันชอบ:

def number = '123' as int

10
ปัญหาเดียวกันกับข้างต้นนี้จะโยนข้อยกเว้นถ้าสตริงไม่ได้เป็นจำนวน ตรวจสอบกับisInteger()ก่อน
Andres Kievsky

12
@ank คำถามที่ถามเทียบเท่าของInteger.parseInt(String)ที่ยังพ่นยกเว้นถ้าสตริงไม่เป็นตัวเลขเพื่อให้ได้รับคำถามที่ฉันไม่ได้พิจารณาเรื่องนี้ "ปัญหา"
Dónal

30

ในฐานะที่เป็นภาคผนวกคำตอบที่ดอนไม่เพียง แต่แรงเพิ่ม.toInteger()วิธีการเพื่อให้Strings ก็ยังเพิ่มtoBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(), และtoList()toLong()

ในหลอดเลือดดำเดียวกัน groovy ยังเพิ่มis*eqivalents ให้กับผู้ที่กลับมาtrueหากStringคำถามที่สามารถแยกวิเคราะห์เป็นรูปแบบในคำถาม

หน้า GDK ที่เกี่ยวข้องอยู่ที่นี่


8
นี่คือคำตอบที่ถูกต้อง - ตรวจสอบก่อนisInteger()แล้วทำtoInteger()... นั่นคือถ้าคุณไม่ต้องการเพิ่มtry/ catchบล็อก :) แต่การใช้ข้อยกเว้นสำหรับสิ่งนี้เป็นแนวคิดที่ไม่ดี
Andres Kievsky

2
@anktastic ฉันเถียงว่าคำตอบของฉันถูกต้องมากขึ้นเพราะคำถามที่ถามหา "เทียบเท่า Groovy ของ Java ของ Integer.parseInt (String)" คือแปลงไม่ จำกัด
Dónal

25

ฉันไม่แน่ใจว่ามันถูกเปิดตัวใน groovy รุ่นล่าสุด (คำตอบเริ่มต้นค่อนข้างเก่า) แต่ตอนนี้คุณสามารถใช้:

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

หรือ

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

ฉันขอแนะนำให้ใช้ float หรือ double แทนจำนวนเต็มในกรณีที่สตริงที่ให้ไว้ไม่น่าเชื่อถือ


2
1 ทางออกที่ดีที่สุด IMO ตามที่มีการตรวจสอบ null นอกเหนือไปจากประเภทการตรวจสอบก่อนการแปลง
kaskelotti

ฉันไม่แนะนำให้ใช้โฟลตหรือดับเบิลเพราะมันไม่ถูกต้องโดยเนื้อแท้ เนื่องจาก Groovy ทำให้การใช้ BigDecimals เป็นเรื่องง่ายเหมือนกับหมายเลขอื่น ๆ หากคุณต้องการความแม่นยำมากกว่า Integer ให้ใช้หมายเลขนั้น ประการที่สองวิธีนี้ดูเหมือนปลอดภัย แต่ผลลัพธ์อาจเป็น NUM == null ดังนั้นคุณต้องระวังด้วย
Hans Bogaards

สำหรับตัวอย่างรหัสแรกผมคิดว่าคุณอยากจะเขียนแทนmystring.toInteger() mystring.toFloat()ดังนั้นdef num = mystring?.isInteger() ? mystring.toInteger() : nullจะถูกต้อง
Sk8erPeter

15

Groovy ยอมรับรูปแบบ Java ได้ดี หากคุณกำลังถามว่ามีความเป็นGroovierIntegerวิธีมีวิธีที่จะไป

ทั้งสองแสดงไว้ที่นี่:

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

5
คำตอบนี้จะแสดงเมื่อสตริงไม่ใช่ตัวเลข - ระวัง!
Andres Kievsky

6

นอกจากนี้คุณสามารถนำเข้าคงที่

import static java.lang.Integer.parseInt as asInteger

และหลังการใช้งานนี้

String s = "99"
asInteger(s)

เรียบร้อยฉันลืมเรื่องเล็ก ๆ น้อย ๆ ไปมาก
Magic Octopus Urn


2

หลายวิธีในการบรรลุเป้าหมายนี้ ตัวอย่างมีดังนี้

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

หวังว่านี่จะช่วยได้


1
การเพิ่มสิ่งนี้ลงในคำถามที่ไม่ได้มีอยู่ใน 8 คำตอบที่มีอยู่นั้นเป็นอย่างไร
LukeG

ไม่ดีของฉันได้โลภนิดหน่อยที่นี่
Darth Shekhar




0

วิธีการใช้ยังคงเป็น toInteger () เนื่องจากไม่ได้คัดค้านอย่างแท้จริง

int value = '99'.toInteger()

เวอร์ชั่น String เลิกใช้แล้ว แต่ CharSequence เป็นอินเทอร์เฟซที่ String ดำเนินการ ดังนั้นการใช้ String ก็โอเคเพราะรหัสของคุณจะยังใช้งานได้แม้ว่าเมธอดจะทำงานกับ CharSequence เท่านั้น ไปเหมือนกันสำหรับ isInteger ()

ดูคำถามนี้สำหรับการอ้างอิง: วิธีแปลงสตริงเป็น CharSequence ได้อย่างไร

ฉันแสดงความคิดเห็นเพราะความคิดของการเลิกใช้วิธีการนี้ทำให้ฉันสับสนและฉันต้องการหลีกเลี่ยงปัญหานี้สำหรับคนอื่น ๆ


-1

วิธีที่ง่ายกว่าในการแปลงสตริงเป็นจำนวนเต็มใน Groovy มีดังต่อไปนี้ ...

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

ตอนนี้ "i" ถือค่าจำนวนเต็ม


4
สิ่งนี้จะเพิ่มคำตอบที่มีอยู่? คำตอบที่ยอมรับโพสต์เมื่อ 9 ปีที่แล้วเริ่มต้นด้วย: "ใช้toInteger()วิธีการแปลง ...
ภาษาเริ่มต้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.