2012-06-19 33 views
7

Tôi đang tạo một ứng dụng dựa trên web và tôi có các trường văn bản trong đó các giá trị được lưu trữ dưới dạng Chuỗi. Vấn đề là một số trường văn bản sẽ được phân tích cú pháp thành int và bạn có thể lưu trữ số lớn hơn nhiều trong các chuỗi hơn là bạn có thể trong một int. Câu hỏi của tôi là, cách tốt nhất để đảm bảo rằng số chuỗi có thể được phân tích cú pháp thành một int mà không bị lỗi.Cách tốt nhất để đảm bảo chuỗi có thể được lưu trữ dưới dạng int trong java

+11

Xác thực đầu vào bằng cách phân tích bằng 'Integer.parseInt (...)' trong 'try/catch (NumberFormatException e)'. –

+0

Số của bạn lớn đến mức nào? Là số của bạn nó ra khỏi phạm vi của các loại có sẵn trong java (Double/Float)? – Santosh

+0

@HovercraftFullOfEels Tôi không nghĩ rằng OP đang nói về 'NumberFormatException'. Tôi nghĩ là về 'Chuỗi' khi được chuyển thành một số (' Số nguyên'), có thể nằm ngoài phạm vi. –

Trả lời

11

Bạn có thể sử dụng cấu trúc try/catch cho điều đó.

try { 
    Integer.parseInt(yourString); 
    //new BigInteger(yourString); 
    //Use the above if parsing amounts beyond the range of an Integer. 
} catch (NumberFormatException e) { 
    /* Fix the problem */ 
} 
+0

cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. đã làm được điều đó. – user1423793

0

Bạn có thể chạy một kiểm tra trong mã của bạn:

  • Chuyển đổi String thành một dài.
  • So sánh giá trị dài so với giá trị lớn nhất của một số nguyên (một hằng số trong lớp Integer.)
  • Nếu dài lớn hơn, bạn biết rằng nó không thể được phân tích cú pháp thành int mà không tràn.
  • Nếu nó nhỏ hơn hoặc bằng, hãy chuyển đổi dài của bạn thành một int.
+0

Tại sao không chỉ chuyển đổi nó thẳng thành một int? – luketorjussen

+0

Bởi vì tôi ngớ ngẩn, rõ ràng. (Sẽ không phải là int có thể tràn vào một giá trị tiêu cực, hoặc thất bại? Nó sẽ yêu cầu một khối try/catch, mà phải thừa nhận là câu trả lời tốt hơn.) – BlackVegetable

0

Luôn phân tích chuỗi trong khối try catch vì vậy nếu có bất kỳ ngoại lệ hoặc lỗi nào xảy ra, bạn biết rằng có một số lỗi trong chuỗi để phân tích cú pháp.

5

Phương pháp Integer.parseInt kiểm tra phạm vi như là explicited bởi javadoc:

An exception of type NumberFormatException is thrown if any of the following situations occurs: 
The first argument is null or is a string of length zero. 
The radix is either smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX. 
Any character of the string is not a digit of the specified radix, except that the first character may be a minus sign '-' ('\u002D') provided that the string is longer than length 1. 
The value represented by the string is not a value of type int. 
Examples: 
parseInt("0", 10) returns 0 
parseInt("473", 10) returns 473 
parseInt("-0", 10) returns 0 
parseInt("-FF", 16) returns -255 
parseInt("1100110", 2) returns 102 
parseInt("2147483647", 10) returns 2147483647 
parseInt("-2147483648", 10) returns -2147483648 
parseInt("2147483648", 10) throws a NumberFormatException 
parseInt("99", 8) throws a NumberFormatException 
parseInt("Kona", 10) throws a NumberFormatException 
parseInt("Kona", 27) returns 411787 

Vì vậy, một cách chính xác là cố gắng phân tích các chuỗi:

try { 
    Integer.parseInt(str); 
} catch (NumberFormatException e) { 
    // not an int 
} 
+0

cảm ơn bạn. Tuy nhiên, điều đó đã làm việc – user1423793

3

Phân tích các chuỗi để một BigInteger thay vì một Integer thông thường. Điều này có thể giữ giá trị cao hơn nhiều.

BigInteger theInteger = new BigInteger(stringToBeParsed); 
+0

Điều đó dường như không trả lời được câu hỏi. –

+0

+1 Tôi nghĩ rằng đây là những gì OP đang tìm kiếm. –

+0

@dystroy. Thực ra tôi nghĩ là vậy. Cách tôi đọc câu hỏi là anh ta muốn người dùng có thể nhập bất kỳ số nào, nhưng không muốn chương trình bị sập do số lượng ong lớn –

0

Bạn có thể sử dụng Apache Commons Lang.

import org.apache.commons.lang.math.NumberUtils; 

NumberUtils.toInt("", 10); // returns 10 
NumberUtils.toInt(null, 10); // returns 10 
NumberUtils.toInt("1", 0); // returns 1 

Số thứ hai là mặc định nếu Chuỗi không phải là giá trị số. Tham số đầu tiên là Chuỗi bạn đang cố gắng chuyển đổi.

Đối với một số lượng lớn tôi sẽ làm như sau

BigInteger val = null; 
try { 
    val = new BigInteger("1"); 
} catch (NumberFormatException e) { 
    val = BigInteger.ZERO; 
} 
+0

Bạn cũng có thể sử dụng Long? – mrswadge

0

gì về điều này?

BigInteger bigInt = BigInteger(numberAsString); 
boolean fitsInInt = (bigInt.compareTo(BigInteger.valueOf(bigInt.intValue())) == 0; 
Các vấn đề liên quan