Làm cách nào để chuyển đổi một Chuỗi thành một int trong Java?


3026

Làm cách nào tôi có thể chuyển đổi Stringthành một inttrong Java?

Chuỗi của tôi chỉ chứa các số và tôi muốn trả về số mà nó đại diện.

Ví dụ, cho chuỗi "1234"kết quả sẽ là số 1234.


1
Nhân tiện, lưu ý rằng nếu chuỗi là null, lệnh gọi: int i = Integer.parseInt (null); ném NumberFormatException, không phải NullPulumException.
Pavel Molchanov

2
Tôi hơi ngạc nhiên khi câu hỏi này nên được đánh giá cao khi thiếu một phần quan trọng của đặc tả: điều gì sẽ xảy ra nếu chuỗi KHÔNG chỉ chứa các chữ số? Ví dụ: nhiều câu trả lời sẽ vui vẻ phân tích "-1" và trả về -1, nhưng chúng tôi không biết liệu điều đó có chấp nhận được không.
Michael Kay

Câu trả lời:


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

Nếu bạn nhìn vào Tài liệu Java, bạn sẽ nhận thấy "cái bẫy" là chức năng này có thể ném ra NumberFormatException, tất nhiên bạn phải xử lý:

int foo;
try {
   foo = Integer.parseInt(myString);
}
catch (NumberFormatException e)
{
   foo = 0;
}

(Điều trị này mặc định một số không đúng 0, nhưng bạn có thể làm điều gì khác nếu bạn muốn.)

Ngoài ra, bạn có thể sử dụng một Intsphương thức từ thư viện Guava, kết hợp với Java 8 Optional, tạo ra một cách mạnh mẽ và ngắn gọn để chuyển đổi một chuỗi thành int:

import com.google.common.primitives.Ints;

int foo = Optional.ofNullable(myString)
 .map(Ints::tryParse)
 .orElse(0)

23
Ngoài việc nắm bắt NumberFormatException, người dùng cũng nên cẩn thận về độ dài của chuỗi mà họ đi qua; nếu chúng đủ dài để tràn một số nguyên, thay vào đó họ có thể muốn xem xét sử dụng Long :: parseLong.
Allison

6
@ ALLison đặc biệt nếu sử dụng trường BIGINT trong trường khóa chính tăng tự động PostgreSQL chẳng hạn. An toàn hơn nhiều khi sử dụng lâu dài
Letkeeprus

7
Bạn có thể kiểm tra xem chuỗi có phải là Số đầu tiên không: stackoverflow.com/questions/1102891/
Khăn

Phương thức này cũng đưa ra ngoại lệ khi chuỗi không phải là số nguyên có thể phân tích được trong cơ sở 10. Sử dụng phương thức quá tải để làm việc trong các cơ sở khác. ví dụ: Integer.parseInt ("1001", 8); cho cơ sở 8. Nguồn .
lokesh

2
Ngoài ra, trong khi sử dụng Guava kết hợp với Tùy chọn của Java 8 có thể mạnh mẽ, nó có thể là quá mức cần thiết và không ngắn gọn như sử dụng NumberUtils.toInt (String str, int defaultValue) từ thư viện commons-lang của Apache :int foo = NumberUtils.toInt(myString, 0);
Kunda

681

Ví dụ, đây là hai cách:

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

Có một sự khác biệt nhỏ giữa các phương pháp này:

  • valueOf trả về một thể hiện mới hoặc được lưu trong bộ nhớ cache của java.lang.Integer
  • parseInttrả về nguyên thủy int.

Điều tương tự là cho tất cả các trường hợp: Short.valueOf/ parseShort, Long.valueOf/ parseLong, v.v.


80
Để biết sự khác biệt giữa hai phương pháp, hãy xem câu hỏi này
hertzsprung

19
valueOfphương pháp chỉ làreturn valueOf(parseInt(string));
Paul Verest

@PaulVerest tôi không hiểu ... valueOfgọi chính nó theo cách đệ quy?
idclev 463035818

1
@ user463035818 valueOf có hai tình trạng quá tải - cho int và String. valueOf(String)được triển khai bằng cách phân tích chuỗi đầu tiên thành int bằng cách sử dụng parseInt(String)và sau đó gói int đó vào một Integer bằng cách sử dụng valueOf(int). Không có đệ quy ở đây vì valueOf(String)valueOf(int)là hai hàm hoàn toàn khác nhau, ngay cả khi chúng có cùng tên.
PhilipRoman

244

Chà, một điểm rất quan trọng cần xem xét là trình phân tích cú pháp Integer ném NumberFormatException như đã nêu trong 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.
}

Điều quan trọng là phải xử lý ngoại lệ này khi cố gắng lấy các giá trị nguyên từ các đối số phân tách hoặc phân tích động một cái gì đó.


Làm thế nào tôi có thể phân tích "26263Hello"? Tôi muốn trích xuất 26263 trong trường hợp đó
idclev 463035818

1
@ user463035818 - Xem docs.oracle.com/javase/8/docs/api/java/util/regex/ trộm - một mẫu biểu hiện thông thường của "([0-9]+)"ý chí sẽ "nắm bắt" chuỗi đầu tiên của một hoặc nhiều chữ số từ một đến chín. Nhìn vào Matcherlớp trong gói đó.
Mark Stewart

83

Làm thủ công:

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;
}

22
Nếu đầu vào lớn hơn 2 ^ 32 thì sao? Nếu đầu vào chứa các ký tự không phải là số thì sao?
yohm

87
Một trong những điều mà lập trình viên phải học khi tham gia lực lượng lao động, nếu không trước đây, là không bao giờ phát minh lại bánh xe. Đây có thể là một bài tập thú vị, nhưng đừng hy vọng mã của bạn sẽ vượt qua đánh giá mã nếu bạn thực hiện loại điều này trong một thiết lập thương mại.
Dawood ibn Kareem

43
-1 Xin lỗi, nhưng đây là một thuật toán khá kém, có nhiều hạn chế, không xử lý lỗi và một số dị thường kỳ lạ (ví dụ: "" đưa ra một ngoại lệ "-" sẽ tạo ra 0 và "+" tạo ra -5). Tại sao mọi người sẽ chọn điều này hơn Integer.parseInt(s)? - Tôi thấy vấn đề về việc đây là một câu hỏi phỏng vấn, nhưng a) không có nghĩa là bạn sẽ làm theo cách này (đó là những gì người hỏi đã hỏi) và b) dù sao câu trả lời này cũng là một ví dụ khá tệ.
SusanW

1
-1 vì nếu tôi muốn phân tích cơ sở 31 int thì sao? Integer.parseInt (str, 31) là một lớp lót để làm điều đó. Hơi bình luận nhẹ nhàng, nhưng điểm nghiêm trọng bên dưới. Không bao giờ phát minh lại bánh xe khi người khác đã đưa tác phẩm vào
Nathan Adams

1
Mã này trông giống như được điều chỉnh từ một thư viện nổi tiếng về IO nhanh trong các cuộc thi lập trình cạnh tranh. Trong bối cảnh đó, dữ liệu đầu vào được đảm bảo là hợp lệ và các giải pháp được phân loại theo tốc độ. Nó sẽ nhanh hơn Integer.parseInt bởi vì nó không xác nhận.
kaya3

53

Một giải pháp thay thế là sử dụng NumberUtils của Apache Commons :

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

Tiện ích Apache rất hay vì nếu chuỗi có định dạng số không hợp lệ thì 0 luôn được trả về. Do đó tiết kiệm cho bạn khối bắt thử.

API NumberUtils API phiên bản 3.4


34
Bạn hiếm khi muốn 0 được sử dụng khi một số không hợp lệ được phân tích cú pháp.
wnoise

4
Không là cái mà java sử dụng làm mặc định nếu trường int trên một đối tượng không được đặt. Vì vậy, trong đó liên quan đến nó có ý nghĩa.
Ryboflavin

15
@Ryboflavin Không, không. Một trong số đó là một ngôn ngữ được xác định rõ ràng về ngữ nghĩa, và ngôn ngữ kia là một ngoại lệ
thanh nhã

43

Hiện tại tôi đang làm bài tập cho trường đại học, nơi tôi không thể sử dụng một số biểu thức nhất định, chẳng hạn như các biểu thức ở trên và bằng cách nhìn vào bảng ASCII, tôi đã xoay sở để làm điều đó. Đó là một mã phức tạp hơn nhiều, nhưng nó có thể giúp những người khác bị hạn chế như tôi.

Điều đầu tiên cần làm là nhận đầu vào, trong trường hợp này là một chuỗi các chữ số; Tôi sẽ gọi nó String number, và trong trường hợp này, tôi sẽ minh họa nó bằng cách sử dụng số 12, do đóString number = "12";

Một hạn chế khác là tôi không thể sử dụng các chu kỳ lặp đi lặp lại, do đó, một forchu trình (sẽ hoàn hảo) cũng không thể được sử dụng. Điều này giới hạn chúng tôi một chút, nhưng một lần nữa, đó là mục tiêu. Vì tôi chỉ cần hai chữ số (lấy hai chữ số cuối), một cách đơn giản đã charAtgiải quyết nó:

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

Có mã, chúng ta chỉ cần tra cứu bảng và thực hiện các điều chỉnh cần thiết:

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

Bây giờ, tại sao lại tăng gấp đôi? Vâng, bởi vì một bước thực sự "kỳ lạ". Hiện tại chúng tôi có hai nhân đôi, 1 và 2, nhưng chúng tôi cần biến nó thành 12, không có thao tác toán học nào chúng tôi có thể làm.

Chúng tôi đang chia số thứ hai (chữ số cuối) cho 10 theo kiểu 2/10 = 0.2(vì thế tại sao lại gấp đôi) như thế này:

 lastdigit = lastdigit/10;

Đây chỉ đơn thuần là chơi với những con số. Chúng tôi đã biến chữ số cuối cùng thành số thập phân. Nhưng bây giờ, hãy nhìn vào những gì xảy ra:

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

Không đi sâu vào toán học, chúng ta chỉ cần cô lập các đơn vị chữ số của một số. Bạn thấy đấy, vì chúng tôi chỉ xem xét 0-9, chia cho bội số 10 giống như tạo một "hộp" nơi bạn lưu trữ nó (hãy nghĩ lại khi giáo viên lớp một của bạn giải thích cho bạn một đơn vị và một trăm là gì). Vì thế:

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

Và ở đó bạn đi. Bạn đã biến một chuỗi các chữ số (trong trường hợp này là hai chữ số), thành một số nguyên gồm hai chữ số đó, xem xét các giới hạn sau:

  • Không có chu kỳ lặp đi lặp lại
  • Không có biểu thức "Magic" nào như parseInt

8
Sử dụng kiểu double để phân tích một số nguyên không chỉ là một ý tưởng tồi về hiệu năng. Các giá trị như 0,2 là các số định kỳ trong biểu diễn dấu phẩy động và không thể được biểu diễn chính xác. Hãy thử System.out.println (0.1 + 0.2) để xem điểm - kết quả sẽ không là 0,3! Tốt hơn nên gắn với mã thư viện bất cứ nơi nào bạn có thể, trong trường hợp này là Integer.parseInt ().
ChrisB

10
Không rõ loại câu trả lời này cố gắng giải quyết là gì, trước tiên, tại sao mọi người nên có giới hạn mà bạn mô tả, thứ hai, tại sao bạn phải xem bảng ASCII vì bạn có thể đơn giản sử dụng '0'cho nhân vật thay vì 48và không bao giờ phải bận tâm với giá trị số thực tế của nó. Thứ ba, toàn bộ đường vòng với doublecác giá trị không có ý nghĩa gì cả khi bạn chia cho mười, chỉ để nhân với mười sau đó. Kết quả đơn giản là semilastdigit * 10 + lastdigitnhư đã học ở trường tiểu học, khi hệ thống thập phân được giới thiệu là
Holger

2
@Holger Cá nhân tôi đã đưa ra hạn chế đó khi lần đầu tiên bắt đầu lập trình và cả khi tôi phải viết (bút / giấy) các tương tác tương tự trong một bài kiểm tra. Không phổ biến, nhưng đó là một phương pháp mà có thể dễ dàng hiểu và trong khi không phải là hiệu quả nhất và đấm đó là một phương pháp làm việc decently đủ cho các dự án nhỏ. SO.SE có nghĩa là để giúp tất cả mọi người, không chỉ một vài. Tôi đã cung cấp một phương pháp thay thế, cho những người bắt đầu bằng cách học cách tạo ra một thuật toán giả và biến nó thành một thuật toán thay vì sử dụng các biểu thức java có sẵn. Mặc dù tôi đã quên rằng '0' rất tuyệt
Oak

2
Đây không phải là một câu trả lời tốt. Câu hỏi là "Làm cách nào để chuyển đổi Chuỗi thành int trong Java?" không, "Làm thế nào để tôi giải quyết vấn đề bài tập về nhà này với các hạn chế tùy ý?" Đó là StackOverflow, không phải HomeworkOverflow.
DavidS

1
Bạn đã đưa ra lý do cho việc sử dụng phương pháp tiếp cận tiểu thuyết này rất rõ ràng, để bản thân nó không phải là một mối quan tâm. Tuy nhiên, bạn nhấn mạnh rằng phương pháp của bạn sử dụng "không có chu kỳ lặp lại" , tuy nhiên ví dụ cụ thể của bạn bỏ qua vấn đề đó hoàn toàn bằng cách mã hóa giải pháp (cho một số có hai chữ số) để chỉ sử dụng semilastdigitlastdigit. Bạn sẽ mã hóa giải pháp của mình như thế nào để tránh "chu kỳ lặp lại" nếu tôi cung cấp cho bạn một chuỗi số hợp lệ có độ dài tùy ý (nghĩa là bất kỳ giá trị nào giữa "-2147483648" và "2147483647"?)
skomisa

38

Integer.decode

Bạn cũng có thể sử dụng public static Integer decode(String nm) throws NumberFormatException.

Nó cũng hoạt động cho cơ sở 8 và 16:

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

Nếu bạn muốn nhận intthay vì Integerbạn có thể sử dụng:

  1. Bỏ hộp:

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

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

Cuối cùng! Một người thực sự bận tâm để đăng kết quả / đầu ra của các chuyển đổi! Bạn cũng có thể thêm một số dấu "-" không?
not2qubit

29

Bất cứ khi nào có khả năng nhỏ nhất là Chuỗi đã cho không chứa Số nguyên, bạn phải xử lý trường hợp đặc biệt này. Đáng buồn thay, các phương thức Java tiêu chuẩn Integer::parseIntInteger::valueOfđưa ra NumberFormatExceptionđể báo hiệu trường hợp đặc biệt này. Do đó, bạn phải sử dụng các ngoại lệ để kiểm soát luồng, thường được coi là kiểu mã hóa xấu.

Theo tôi, trường hợp đặc biệt này nên được xử lý bằng cách trả lại một sản phẩm nào Optional<Integer>. Vì Java không cung cấp một phương thức như vậy, tôi sử dụng trình bao bọc sau:

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

Ví dụ sử dụng:

// prints "12"
System.out.println(tryParseInteger("12").map(i -> i.toString()).orElse("invalid"));
// prints "-1"
System.out.println(tryParseInteger("-1").map(i -> i.toString()).orElse("invalid"));
// prints "invalid"
System.out.println(tryParseInteger("ab").map(i -> i.toString()).orElse("invalid"));

Trong khi điều này vẫn đang sử dụng ngoại lệ cho kiểm soát luồng nội bộ, mã sử dụng trở nên rất sạch sẽ. Ngoài ra, bạn có thể phân biệt rõ ràng trường hợp -1được phân tích cú pháp thành giá trị hợp lệ và trường hợp chuỗi không hợp lệ không thể được phân tích cú pháp.


24

Chuyển đổi một chuỗi thành một int phức tạp hơn là chỉ chuyển đổi một số. Bạn đã nghĩ về các vấn đề sau:

  • Có phải chuỗi chỉ chứa các số 0-9 ?
  • Có gì với - / + trước hoặc sau chuỗi? Điều đó có thể không (tham khảo số kế toán)?
  • Có chuyện gì với MAX _- / MIN_INFINITY? Điều gì sẽ xảy ra nếu chuỗi là 99999999999999999999? Máy có thể coi chuỗi này là int không?

1
Có - và có một trường hợp cạnh khó chịu vào khoảng -2 ^ 31. Nếu bạn cố gắng phủ nhận 2 ^ 31, bạn có thể gặp khó khăn ......
SusanW

24

Phương pháp để làm điều đó:

 1. Integer.parseInt(s)
 2. Integer.parseInt(s, radix)
 3. Integer.parseInt(s, beginIndex, endIndex, radix)
 4. Integer.parseUnsignedInt(s)
 5. Integer.parseUnsignedInt(s, radix)
 6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
 7. Integer.valueOf(s)
 8. Integer.valueOf(s, radix)
 9. Integer.decode(s)
 10. NumberUtils.toInt(s)
 11. NumberUtils.toInt(s, defaultValue)

Integer.valueOf tạo đối tượng Integer, tất cả các phương thức khác - int nguyên thủy.

2 phương pháp cuối cùng từ commons-lang3 và bài viết lớn về chuyển đổi ở đây .


22

Chúng ta có thể sử dụng parseInt(String str)phương thức của Integerlớp bao bọc để chuyển đổi giá trị Chuỗi thành giá trị nguyên.

Ví dụ:

String strValue = "12345";
Integer intValue = Integer.parseInt(strVal);

Các Integerlớp học cũng cung cấp các valueOf(String str)phương pháp:

String strValue = "12345";
Integer intValue = Integer.valueOf(strValue);

Chúng tôi cũng có thể sử dụng toInt(String strValue)các NumberUtils Utility Lớp cho việc chuyển đổi:

String strValue = "12345";
Integer intValue = NumberUtils.toInt(strValue);

22

Sử dụng Integer.parseInt(yourString).

Hãy nhớ những điều sau đây:

Integer.parseInt("1"); // đồng ý

Integer.parseInt("-1"); // đồng ý

Integer.parseInt("+1"); // đồng ý

Integer.parseInt(" 1"); // Ngoại lệ (khoảng trống)

Integer.parseInt("2147483648");// Ngoại lệ (Số nguyên được giới hạn ở giá trị tối đa là 2.147.483.647)

Integer.parseInt("1.1");// Ngoại lệ ( . Hoặc , hoặc bất cứ điều gì không được phép)

Integer.parseInt(""); // Ngoại lệ (không phải 0 hoặc một cái gì đó)

Chỉ có một loại ngoại lệ: NumberFormatException


Giá trị tối đa int ở đây cũng cung cấp cho NumberFormatException?
Mã hóa Wombat

Không, giá trị tối đa vẫn ổn
Lukas Bauer

19

Tôi có một giải pháp, nhưng tôi không biết nó hiệu quả như thế nào. Nhưng nó hoạt động tốt, và tôi nghĩ bạn có thể cải thiện nó. Mặt khác, tôi đã thực hiện một vài thử nghiệm với JUnit , bước nào chính xác. Tôi đã đính kèm chức năng và kiểm tra:

static public Integer str2Int(String str) {
    Integer result = null;
    if (null == str || 0 == str.length()) {
        return null;
    }
    try {
        result = Integer.parseInt(str);
    } 
    catch (NumberFormatException e) {
        String negativeMode = "";
        if(str.indexOf('-') != -1)
            negativeMode = "-";
        str = str.replaceAll("-", "" );
        if (str.indexOf('.') != -1) {
            str = str.substring(0, str.indexOf('.'));
            if (str.length() == 0) {
                return (Integer)0;
            }
        }
        String strNum = str.replaceAll("[^\\d]", "" );
        if (0 == strNum.length()) {
            return null;
        }
        result = Integer.parseInt(negativeMode + strNum);
    }
    return result;
}

Kiểm tra với JUnit:

@Test
public void testStr2Int() {
    assertEquals("is numeric", (Integer)(-5), Helper.str2Int("-5"));
    assertEquals("is numeric", (Integer)50, Helper.str2Int("50.00"));
    assertEquals("is numeric", (Integer)20, Helper.str2Int("$ 20.90"));
    assertEquals("is numeric", (Integer)5, Helper.str2Int(" 5.321"));
    assertEquals("is numeric", (Integer)1000, Helper.str2Int("1,000.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("0.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int(".50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("-.10"));
    assertEquals("is numeric", (Integer)Integer.MAX_VALUE, Helper.str2Int(""+Integer.MAX_VALUE));
    assertEquals("is numeric", (Integer)Integer.MIN_VALUE, Helper.str2Int(""+Integer.MIN_VALUE));
    assertEquals("Not
     is numeric", null, Helper.str2Int("czv.,xcvsa"));
    /**
     * Dynamic test
     */
    for(Integer num = 0; num < 1000; num++) {
        for(int spaces = 1; spaces < 6; spaces++) {
            String numStr = String.format("%0"+spaces+"d", num);
            Integer numNeg = num * -1;
            assertEquals(numStr + ": is numeric", num, Helper.str2Int(numStr));
            assertEquals(numNeg + ": is numeric", numNeg, Helper.str2Int("- " + numStr));
        }
    }
}

Bạn có thể làm điều đó đơn giản hơn:(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
Dávid Horváth


17

Bạn cũng có thể bắt đầu bằng cách xóa tất cả các ký tự không phải là số và sau đó phân tích số nguyên:

String mystr = mystr.replaceAll("[^\\d]", "");
int number = Integer.parseInt(mystr);

Nhưng được cảnh báo rằng điều này chỉ hoạt động cho các số không âm.


18
Điều này sẽ gây ra -42được phân tích cú pháp như 42.

10
Vâng, điều này chỉ hoạt động đối với các số không âm là chính xác để bắt đầu và do đó, không cần bước thay thế này. Đối với mọi trường hợp khác, nỗ lực này để tự động sửa nó, sẽ làm mọi thứ tồi tệ hơn (vì hầu như mọi nỗ lực để tự động sửa một cái gì đó). Nếu tôi đi vào "4+2", tôi sẽ nhận được 42kết quả mà không có bất kỳ gợi ý nào về việc những gì tôi đã cố gắng làm là sai lầm. Người dùng sẽ có ấn tượng rằng nhập các biểu thức cơ bản như 4+2là một đầu vào hợp lệ, nhưng ứng dụng tiếp tục với một giá trị sai. Bên cạnh đó, loại là String, không string...
Holger

Hoặc thay đổi dòng đầu tiên thành -> chuỗi mystr = mystr.replaceAll ("[^ \\ d \\ -]", "");
apm

13

Ngoài các câu trả lời trước, tôi muốn thêm một số chức năng. Đây là kết quả trong khi bạn sử dụng chúng:

public static void main(String[] args) {
  System.out.println(parseIntOrDefault("123", 0)); // 123
  System.out.println(parseIntOrDefault("aaa", 0)); // 0
  System.out.println(parseIntOrDefault("aaa456", 3, 0)); // 456
  System.out.println(parseIntOrDefault("aaa789bbb", 3, 6, 0)); // 789
}

Thực hiện:

public static int parseIntOrDefault(String value, int defaultValue) {
  int result = defaultValue;
  try {
    result = Integer.parseInt(value);
  }
  catch (Exception e) {
  }
  return result;
}

public static int parseIntOrDefault(String value, int beginIndex, int defaultValue) {
  int result = defaultValue;
  try {
    String stringValue = value.substring(beginIndex);
    result = Integer.parseInt(stringValue);
  }
  catch (Exception e) {
  }
  return result;
}

public static int parseIntOrDefault(String value, int beginIndex, int endIndex, int defaultValue) {
  int result = defaultValue;
  try {
    String stringValue = value.substring(beginIndex, endIndex);
    result = Integer.parseInt(stringValue);
  }
  catch (Exception e) {
  }
  return result;
}

10

Như đã đề cập, Apache Commons NumberUtilscó thể làm điều đó. Nó trả về 0nếu nó không thể chuyển đổi một chuỗi thành int.

Bạn cũng có thể xác định giá trị mặc định của riêng bạn:

NumberUtils.toInt(String str, int defaultValue)

Thí dụ:

NumberUtils.toInt("3244", 1) = 3244
NumberUtils.toInt("", 1)     = 1
NumberUtils.toInt(null, 5)   = 5
NumberUtils.toInt("Hi", 6)   = 6
NumberUtils.toInt(" 32 ", 1) = 1 // Space in numbers are not allowed
NumberUtils.toInt(StringUtils.trimToEmpty("  32 ", 1)) = 32;

9

Bạn cũng có thể sử dụng mã này, với một số biện pháp phòng ngừa.

  • Tùy chọn # 1: Xử lý ngoại lệ một cách rõ ràng, ví dụ, hiển thị hộp thoại thông báo và sau đó dừng thực thi quy trình công việc hiện tại. Ví dụ:

    try
        {
            String stringValue = "1234";
    
            // From String to Integer
            int integerValue = Integer.valueOf(stringValue);
    
            // Or
            int integerValue = Integer.ParseInt(stringValue);
    
            // Now from integer to back into string
            stringValue = String.valueOf(integerValue);
        }
    catch (NumberFormatException ex) {
        //JOptionPane.showMessageDialog(frame, "Invalid input string!");
        System.out.println("Invalid input string!");
        return;
    }
  • Tùy chọn # 2: Đặt lại biến bị ảnh hưởng nếu luồng thực thi có thể tiếp tục trong trường hợp có ngoại lệ. Ví dụ: với một số sửa đổi trong khối bắt

    catch (NumberFormatException ex) {
        integerValue = 0;
    }

Sử dụng hằng số chuỗi để so sánh hoặc bất kỳ loại máy tính nào luôn là một ý tưởng hay, bởi vì hằng số không bao giờ trả về giá trị null.


4
Đặt JOptionPane.showMessageDialog()câu trả lời cho câu hỏi vanilla Java không có ý nghĩa.
John Hascall

2
Integer.valueOf(String);không trả về loại int.
php_coder_3809625

9

Bạn có thể sử dụng new Scanner("1244").nextInt(). Hoặc hỏi nếu thậm chí một int tồn tại:new Scanner("1244").hasNextInt()


9

Trong các cuộc thi lập trình, khi bạn chắc chắn rằng số đó sẽ luôn là số nguyên hợp lệ, thì bạn có thể viết phương thức của riêng mình để phân tích cú pháp đầu vào. Điều này sẽ bỏ qua tất cả các mã liên quan đến xác thực (vì bạn không cần bất kỳ mã nào trong số đó) và sẽ hiệu quả hơn một chút.

  1. Đối với số nguyên dương hợp lệ:

    private static int parseInt(String str) {
        int i, n = 0;
    
        for (i = 0; i < str.length(); i++) {
            n *= 10;
            n += str.charAt(i) - 48;
        }
        return n;
    }
  2. Đối với cả số nguyên dương và số âm:

    private static int parseInt(String str) {
        int i=0, n=0, sign=1;
        if (str.charAt(0) == '-') {
            i = 1;
            sign = -1;
        }
        for(; i<str.length(); i++) {
            n* = 10;
            n += str.charAt(i) - 48;
        }
        return sign*n;
    }
  3. Nếu bạn đang mong đợi một khoảng trắng trước hoặc sau những con số này, thì hãy đảm bảo thực hiện str = str.trim()trước khi xử lý thêm.


7

Đơn giản là bạn có thể thử điều này:

  • Sử dụng Integer.parseInt(your_string);để chuyển đổi Stringthànhint
  • Sử dụng Double.parseDouble(your_string);để chuyển đổi Stringthànhdouble

Thí dụ

String str = "8955";
int q = Integer.parseInt(str);
System.out.println("Output>>> " + q); // Output: 8955

String str = "89.55";
double q = Double.parseDouble(str);
System.out.println("Output>>> " + q); // Output: 89.55

Câu trả lời này dường như không thêm bất cứ điều gì ngoài các câu trả lời đề xuất Integer.parseInt đã đăng trước đó vài năm (chuyển đổi Chuỗi thành gấp đôi sẽ là một câu hỏi khác ).
Bernhard Barker

7

Đối với một chuỗi bình thường, bạn có thể sử dụng:

int number = Integer.parseInt("1234");

Đối với trình tạo chuỗi và bộ đệm Chuỗi, bạn có thể sử dụng:

Integer.parseInt(myBuilderOrBuffer.toString());

6
int foo=Integer.parseInt("1234");

Đảm bảo không có dữ liệu không phải là số trong chuỗi.


5
Điều này giống hệt như câu trả lời chọn.
Steve Smith

5
Không có giá trị cho trang web, khi lặp lại một câu trả lời rằng người khác đã đăng NĂM NĂM trước bạn.
Dawood ibn Kareem

Điều này đã được bao gồm trong câu trả lời được chấp nhận (được đăng khoảng 5 năm trước).
Peter Mortensen

6

Tôi hơi ngạc nhiên khi không ai đề cập đến hàm tạo Integer lấy String làm tham số.

Vì vậy, đây là:

String myString = "1234";
int i1 = new Integer(myString);

Java 8 - Số nguyên (Chuỗi) .

Tất nhiên, hàm tạo sẽ trả về kiểu Integervà một hoạt động unboxing chuyển đổi giá trị thành int.


Điều quan trọng cần đề cập : Hàm tạo này gọi parseIntphương thức.

public Integer(String var1) throws NumberFormatException {
    this.value = parseInt(var1, 10);
}

5

Sử dụng Integer.parseInt () và đặt nó vào trong một try...catchkhối để xử lý bất kỳ lỗi nào chỉ trong trường hợp nhập một ký tự không phải là số, ví dụ:

private void ConvertToInt(){
    String string = txtString.getText();
    try{
        int integerValue=Integer.parseInt(string);
        System.out.println(integerValue);
    }
    catch(Exception e){
       JOptionPane.showMessageDialog(
         "Error converting string to integer\n" + e.toString,
         "Error",
         JOptionPane.ERROR_MESSAGE);
    }
 }


5

Nó có thể được thực hiện theo bảy cách:

import com.google.common.primitives.Ints;
import org.apache.commons.lang.math.NumberUtils;

String number = "999";

1) Sử dụng Ints.tryParse:

int result = Ints.tryParse(number);

2) Sử dụng NumberUtils.createInteger:

Integer result = NumberUtils.createInteger(number);

3) Sử dụng NumberUtils.toInt:

int result = NumberUtils.toInt(number);

4) Sử dụng Integer.valueOf:

Integer result = Integer.valueOf(number);

5) Sử dụng Integer.parseInt:

int result = Integer.parseInt(number);

6) Sử dụng Integer.decode:

int result = Integer.decode(number);

7) Sử dụng Integer.parseUnsignedInt:

int result = Integer.parseUnsignedInt(number);

NumberUtils cũng xử lý các tình huống rỗng và trống.
Sundararaj Govindasamy

5

Một phương thức là parseInt (String). Nó trả về một int nguyên thủy:

String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);

Phương thức thứ hai là valueOf (String) và nó trả về một đối tượng Integer () mới:

String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);

Điều này không được bao gồm trong các câu trả lời trước?
Peter Mortensen

4

Bạn có thể sử dụng bất kỳ cách nào sau đây:

  1. Integer.parseInt(s)
  2. Integer.parseInt(s, radix)
  3. Integer.parseInt(s, beginIndex, endIndex, radix)
  4. Integer.parseUnsignedInt(s)
  5. Integer.parseUnsignedInt(s, radix)
  6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
  7. Integer.valueOf(s)
  8. Integer.valueOf(s, radix)
  9. Integer.decode(s)
  10. NumberUtils.toInt(s)
  11. NumberUtils.toInt(s, defaultValue)

4

Đây là một chương trình hoàn chỉnh với tất cả các điều kiện tích cực và tiêu cực mà không cần sử dụng thư viện

import java.util.Scanner;


public class StringToInt {

    public static void main(String args[]) {
        String inputString;
        Scanner s = new Scanner(System.in);
        inputString = s.nextLine();

        if (!inputString.matches("([+-]?([0-9]*[.])?[0-9]+)")) {
            System.out.println("Not a Number");
        }
        else {
            Double result2 = getNumber(inputString);
            System.out.println("result = " + result2);
        }
    }


    public static Double getNumber(String number) {
        Double result = 0.0;
        Double beforeDecimal = 0.0;
        Double afterDecimal = 0.0;
        Double afterDecimalCount = 0.0;
        int signBit = 1;
        boolean flag = false;

        int count = number.length();
        if (number.charAt(0) == '-') {
            signBit = -1;
            flag = true;
        }
        else if (number.charAt(0) == '+') {
            flag = true;
        }
        for (int i = 0; i < count; i++) {
            if (flag && i == 0) {
                continue;
            }
            if (afterDecimalCount == 0.0) {
                if (number.charAt(i) - '.' == 0) {
                    afterDecimalCount++;
                }
                else {
                    beforeDecimal = beforeDecimal * 10 + (number.charAt(i) - '0');
                }
            }
            else {
                afterDecimal = afterDecimal * 10 + number.charAt(i) - ('0');
                afterDecimalCount = afterDecimalCount * 10;
            }
        }
        if (afterDecimalCount != 0.0) {
            afterDecimal = afterDecimal / afterDecimalCount;
            result = beforeDecimal + afterDecimal;
        }
        else {
            result = beforeDecimal;
        }
        return result * signBit;
    }
}

2
Không cần phải phát minh lại bánh xe, chỉ cần sử dụng Integer.parseInt.
Dorian Gray

@TobiasWeimer có, chúng tôi có thể làm nhưng điều này không cần sử dụng thư viện
Anup Gupta

@TobiasWeimer, một số người cần cách này để làm mà không cần sử dụng Thư viện.
Anup Gupta

5
Không, không ai cần nó bởi vì nó là một chức năng bên trong JDK, không phải một số plugin của bên thứ ba.
Dorian Gray
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.