Chuyển đổi một chuỗi thành int trong Groovy


286

Tôi có một Stringđại diện cho một giá trị số nguyên và muốn chuyển đổi nó thành một int. Có một Groovy tương đương với Java Integer.parseInt(String)?


1
Tại sao không sử dụng từ khóa def?
khắp nơi vào

4
Tôi có một tham số chuỗi có chứa một số nguyên. Sử dụng def i = string_parameter cho kết quả ngoại lệ trong lớp nếu sau này tôi sử dụng i làm int.
Steve Kuo

Câu trả lời:


492

Sử dụng toInteger()phương thức để chuyển đổi a Stringthành an Integer, vd

int value = "99".toInteger()

Một cách khác, tránh sử dụng phương pháp không dùng nữa (xem bên dưới) là

int value = "66" as Integer

Nếu bạn cần kiểm tra xem String thể chuyển đổi trước khi thực hiện chuyển đổi hay không, hãy sử dụng

String number = "66"

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

Cập nhật khấu hao

Trong các phiên bản gần đây của Groovy, một trong những toInteger()phương pháp đã không được chấp nhận. Sau đây được lấy từ org.codehaus.groovy.runtime.StringGroovyMethodsGroovy 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);
}

Bạn có thể buộc phiên bản không được dùng của phương thức được gọi bằng cách sử dụng một cái gì đó khủng khiếp như:

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

Cá nhân, tôi rất thích:

int num = 66 as Integer

19
Caveat emptor: bạn cần kiểm tra giá trị isInteger()trước, vì toInteger()sẽ đưa ra một ngoại lệ nếu chuỗi không phải là số. toFloat()isFloat()
Áp

8
Trong tài liệu api 2.1.6 isInteger / toInteger không được dùng nữa. Cách tốt nhất hiện nay để làm điều này là gì?
pakman

1
Mặc dù vậy, sử dụng Integer paramValue = params.int ('paramName') không an toàn. Nếu không có param có tên "paramName" trong bản đồ param, bạn sẽ có một ngoại lệ về việc không thể chuyển null thành int.
Michael

2
chỉ muốn thêm vào, vì Groovy 1.8 intthực sự là vậy int. Groovy vẫn sẽ hiển thị lớp Integer, vì quyền anh, nhưng ví dụ, bạn sẽ không thể gán nullcho một int, điều có thể có trong 1.0. Chúng tôi coi thay đổi là không quan trọng, vì bạn đã không thể sử dụng null làm đối số cho tham số gọi phương thức loại int. Tất cả vẫn khác với Java, vì trong Java, bạn không thể chuyển đổi Integer thành Long bằng một phép gán đơn giản hoặc gọi một phương thức int lấy bằng Long.
blackdrag

1
@pakman StringGroovyMethods.isInteger(String)DefaultGroovyMethods.isInteger(CharSequence)không được ủng hộ StringGroovyMethods.isInteger(CharSequence). Cùng đi cho toInteger().
bmaupin

67

Một số cách để làm điều này, đây là cách yêu thích của tôi:

def number = '123' as int

10
Vấn đề tương tự như trên, điều này sẽ đưa ra một ngoại lệ nếu chuỗi không phải là một số. Kiểm tra với isInteger()đầu tiên.
Andres Kievsky

12
@ank câu hỏi yêu cầu tương đương Integer.parseInt(String)cũng ném Ngoại lệ nếu chuỗi không phải là số, vì vậy, với câu hỏi, tôi không coi đây là "vấn đề"
Dónal

30

Là một phụ lục cho câu trả lời của Don , không chỉ Groovy thêm một.toInteger() phương pháp để Strings, nó cũng cho biết thêm toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(), toList(), và toLong().

Trong cùng một hướng, Groovy cũng thêm các is*eqivalents cho tất cả những người trả về truenếu Stringcâu hỏi có thể được phân tích thành định dạng trong câu hỏi.

Trang GDK có liên quan ở đây.


8
Đây là câu trả lời đúng - trước tiên hãy kiểm tra isInteger(), sau đó làm toInteger()... nghĩa là, trừ khi bạn muốn thêm mộttry / catchkhối :) nhưng sử dụng ngoại lệ cho việc này là một ý tưởng tồi.
Andres Kievsky

2
@anktastic Tôi cho rằng câu trả lời của tôi chính xác hơn vì câu hỏi yêu cầu "tương đương với Groer.parseInt (Chuỗi)" của Java, tức là một chuyển đổi không được kiểm tra
Dónal

25

Tôi không chắc liệu nó có được giới thiệu trong các phiên bản gần đây của Groovy không (câu trả lời ban đầu khá cũ), nhưng bây giờ bạn có thể sử dụng:

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

hoặc là

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

Tôi khuyên bạn nên sử dụng số float hoặc thậm chí gấp đôi thay vì số nguyên trong trường hợp nếu chuỗi được cung cấp không đáng tin cậy.


2
+1 giải pháp tốt nhất IMO vì nó bao gồm kiểm tra null ngoài kiểm tra loại trước khi chuyển đổi
kaskelotti

Tôi khuyên bạn không nên sử dụng phao hoặc đôi vì chúng không chính xác. Vì Groovy giúp việc sử dụng BigDecimals dễ dàng như bất kỳ Số nào khác, nếu bạn cần độ chính xác cao hơn Số nguyên, hãy sử dụng số đó. Thứ hai, cách tiếp cận này có vẻ an toàn, nhưng kết quả có thể là num == null, vì vậy bạn cần cẩn thận với điều đó
Hans Bogaards

Đối với mã mẫu đầu tiên, tôi đoán bạn muốn viết mystring.toInteger()thay vì mystring.toFloat(). Như vậy def num = mystring?.isInteger() ? mystring.toInteger() : nullsẽ đúng.
Sk8erPeter

15

Vâng, Groovy chấp nhận hình thức Java tốt. Nếu bạn đang hỏi nếu có một cách Groovier , có một cách để đi đến Integer.

Cả hai đều được hiển thị ở đây:

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

5
Câu trả lời này cũng ném khi chuỗi không phải là số - xem ra!
Andres Kievsky

6

bạn cũng có thể thực hiện nhập tĩnh

import static java.lang.Integer.parseInt as asInteger

và sau khi sử dụng

String s = "99"
asInteger(s)

Gọn gàng, tôi quên đi những điều nhỏ nhặt rất nhiều.
Bạch tuộc ma thuật Urn

3

toInteger() phương pháp có sẵn trong Groovy, bạn có thể sử dụng đó.


2

Một số cách để đạt được điều này. Ví dụ như dưới đây

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

Hi vọng điêu nay co ich


1
Làm thế nào điều này thêm bất cứ điều gì vào câu hỏi chưa có trong 8 câu trả lời hiện có?
LukeG

Xấu của tôi, có một chút tham lam ở đây
Darth Shekhar

1

Chuyển đổi Groovy Style:

Integer num = '589' as Integer

Nếu bạn có tham số yêu cầu:

Integer age = params.int('age')


0

Đây là một cách khác. nếu bạn không thích ngoại lệ.

def strnumber = "100"
def intValue = strnumber.isInteger() ?  (strnumber as int) : null

Tôi nghĩ rằng đây là câu trả lời tương tự như # 16877253 của @Shmaperator
MarkHu

0

Cách sử dụng vẫn phải là toInteger (), vì nó không thực sự bị phản đối.

int value = '99'.toInteger()

Phiên bản Chuỗi không được dùng nữa, nhưng CharSequence là Giao diện mà Chuỗi thực hiện. Vì vậy, sử dụng String là ok, bởi vì mã của bạn vẫn sẽ hoạt động ngay cả khi phương thức sẽ chỉ hoạt động với CharSequence. Tương tự với isInteger ()

Xem câu hỏi này để tham khảo: Làm thế nào để chuyển đổi Chuỗi thành CharSequence?

Tôi nhận xét, bởi vì khái niệm không tán thành phương pháp này khiến tôi bối rối và tôi muốn tránh điều đó cho người khác.


-1

Cách đơn giản hơn để chuyển đổi một chuỗi thành số nguyên trong Groovy là như sau ...

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

Bây giờ "i" Giữ giá trị số nguyên.


4
Điều này thêm gì vào câu trả lời hiện có? Câu trả lời được chấp nhận được đăng 9 năm trước bắt đầu bằng: "Sử dụng toInteger()phương pháp để hội tụ ...
ngôn ngữ mặc định
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.