Câu hỏi Làm thế nào để chuyển đổi một chuỗi thành một int trong Java?


Làm cách nào tôi có thể chuyển đổi String đến một int trong 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ả phải là số 1234.


2520
2018-04-07 18:27


gốc




Các câu trả lời:


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

Xem Tài liệu Java để biết thêm thông tin.


3558
2018-04-07 18:29



Điều này sẽ ném NumberFormatException nếu đầu vào không phải là số hợp lệ. - Francesco Menzani
Ngoài việc đánh bắt một NumberFormatException, người dùng cũng nên cẩn thận về độ dài của các chuỗi mà chúng đang truyền vào; nếu chúng đủ dài để tràn một số nguyên, chúng có thể muốn xem xét sử dụng Long :: parseLong thay thế. - Allison
@Allison đặc biệt là nếu sử dụng trường BIGINT trong trường khóa chính tăng lên tự động PostgreSQL chẳng hạn. An toàn hơn nhiều để sử dụng lâu dài - Letholdrus
Bạn có thể kiểm tra xem chuỗi có phải là Số đầu tiên không: stackoverflow.com/questions/1102891/… - JPRLCol
Phương thức này cũng ném ngoại lệ khi chuỗi không phải là một số nguyên có thể phân tích cú pháp 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


Ví dụ: dưới đâ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ề phiên bản mới hoặc được lưu trong bộ nhớ cache của java.lang.Integer
  • parseInt trả về nguyên thủy int.

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


588
2018-04-07 18:36



Đối với sự khác biệt giữa hai phương pháp, hãy xem câu hỏi này - hertzsprung
valueOf phương pháp chỉ là return valueOf(parseInt(string)); - Paul Verest


Vâng, 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à xử lý ngoại lệ này khi cố gắng lấy các giá trị số nguyên từ các đối số tách hoặc phân tích cú pháp một cái gì đó.


215
2018-04-30 06:54



làm thế nào tôi có thể phân tích "26263Hello"? Tôi muốn giải nén 26263 trong trường hợp đó - user463035818
@ user463035818 - Xem docs.oracle.com/javase/8/docs/api/java/util/regex/… - một mô hình thể hiện thường xuyên của "([0-9]+)" sẽ "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 Matcher trong gói đó. - Mark Stewart


Làm theo cách 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;
}

72
2017-09-11 02:08



Nếu đầu vào lớn hơn 2 ^ 32 thì sao? Điều gì sẽ xảy ra nếu đầu vào chứa các ký tự không phải là số? - yohm
Một trong những điều mà một lập trình viên phải học khi gia nhập lực lượng lao động, nếu không phải trước đây, sẽ không bao giờ tái phát minh ra bánh xe. Đây có thể là một bài tập thú vị, nhưng đừng mong đợi mã của bạn để vượt qua đánh giá mã nếu bạn làm điều này trong một môi trường thương mại. - Dawood ibn Kareem
@yohm đó là trường hợp đặc biệt; bạn có thể xử lý với dài và một số regex; tuy nhiên, khi đó bạn có thể sử dụng parseInt. - Billz
-1 Xin lỗi, nhưng đây là một thuật toán khá kém, với nhiều hạn chế, không xử lý lỗi và một số dị thường lạ (ví dụ "" đưa ra ngoại lệ, "-" sẽ tạo ra 0 và "+" tạo ra -5). Tại sao mọi người lại chọn cái này Integer.parseInt(s)? - Tôi thấy điểm này là một câu hỏi phỏng vấn, nhưng a) không ngụ ý bạn làm theo cách này (đó là những gì người hỏi hỏi), và b) câu trả lời này là một ví dụ khá tệ. - SusanW
Tôi cho rằng câu trả lời này là dành cho các nghiên cứu sinh tò mò ... - Timur Milovanov


Hiện tại tôi đang làm một bài tập cho đại học, nơi mà tôi không thể sử dụng các biểu thức nào đó, 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 đã quản lý nó. Đó 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, một chuỗi các chữ số; Tôi sẽ gọi nó String numbervà 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 đó, for chu kỳ (vốn đã hoàn hảo) cũng không thể sử dụng được. Điều này hạn chế chúng tôi một chút, nhưng sau đó 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), đơ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 tôi 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, vì một bước thực sự "kỳ lạ". Hiện tại chúng tôi có hai đôi, 1 và 2, nhưng chúng ta cần biến nó thành 12, không có bất kỳ hoạt động toán học nào mà chúng ta có thể làm.

Chúng tôi đang chia phần sau (lastdigit) cho 10 trong thời trang 2/10 = 0.2 (do đó tại sao đôi) như thế này:

 lastdigit = lastdigit/10;

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

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

Nếu không nhận được quá vào toán học, chúng tôi chỉ đơn giản là cô lập các đơn vị các chữ số của một số. Bạn thấy đấy, vì chúng ta chỉ xem 0-9, chia cho bội số của 10 giống như việc tạo một "ô" nơi bạn lưu trữ nó (suy 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 đã chuyể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" như parseInt

38
2018-03-20 23:51



Sử dụng kiểu double để phân tích cú pháp 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 là gắn bó 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
Không rõ vấn đề mà câu trả lời này cố giải quyết, trước tiên, tại sao bất kỳ ai 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ể sử dụng đơn giản '0' cho nhân vật thay vì 48 và 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 double các giá trị không có ý nghĩa gì cả khi bạn được chia cho mười, chỉ để nhân với mười sau đó. Kết quả đơn giản là semilastdigit * 10 + lastdigit như đã học ở trường tiểu học, khi hệ thập phân được giới thiệu… - Holger
@ Holger Tôi đã được cá nhân cho rằng hạn chế khi lần đầu tiên bắt đầu lập trình, và cũng có khi tôi đã phải viết (bút / giấy) 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 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 đang bắt đầu bằng cách học cách tạo 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 tạo trước. Mặc dù tôi đã quên rằng '0' thật tuyệt - Oak


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

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

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

Phiên bản API Apache NumberUtils 3.4


33
2017-08-27 12:07



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
Zero là những gì java sử dụng như một mặc định nếu một trường int trên một đối tượng không được thiết lập. Vì vậy, trong đó liên quan đến nó có ý nghĩa. - Ryboflavin
@Ryboflavin Không, nó không. Một trong số đó là ngữ nghĩa ngôn ngữ được xác định rõ, và ngữ nghĩa kia là một ngoại lệ - etherous


Integer.decode

Bạn cũng có thể 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 được int thay vì Integer bạn có thể dùng:

  1. Đang mở hộp:

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

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

27
2018-03-07 00:42



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


Bất cứ khi nào có khả năng nhỏ nhất mà String đã cho không chứa một 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 chuẩn Integer::parseInt và Integer::valueOf ném một NumberFormatException để báo hiệu trường hợp đặc biệt này. Vì vậy, bạn phải sử dụng các ngoại lệ cho điều khiển 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 Optional<Integer>. Vì Java không cung cấp 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();
    }
}

Sử dụng:

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

Trong khi điều này vẫn còn sử dụng trường hợp ngoại lệ cho kiểm soát dòng chảy nội bộ, mã sử dụng trở nên rất sạch sẽ.


20
2018-04-04 03:13