Trong kinh nghiệm hạn chế của tôi, tôi đã có một số dự án đã có một loại chuỗi tiện ích chuỗi với các phương thức để xác định xem một chuỗi ký tự có phải là một số hay không. Ý tưởng luôn luôn giống nhau, tuy nhiên, việc thực hiện đã khác nhau. Một số bao quanh một nỗ lực phân tích cú pháp với try/catchThực hiện tốt nhất cho phương thức isNumber (string)
public boolean isInteger(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException nfe) {}
return false;
}
và những người khác phù hợp với regex
public boolean isInteger(String str) {
return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
}
Là một trong những phương pháp tốt hơn so với người kia? Cá nhân tôi thích sử dụng cách tiếp cận regex, vì nó ngắn gọn, nhưng nó sẽ thực hiện ngang bằng nếu được gọi trong khi lặp lại, nói, một danh sách của một vài trăm nghìn dây?
Lưu ý: Vì tôi khá mới với trang web, tôi không hiểu đầy đủ về hoạt động kinh doanh Wiki cộng đồng này, vì vậy nếu điều này thuộc về tôi, tôi sẽ sẵn sàng chuyển nó.
EDIT: Với tất cả các đề xuất TryParse tôi đã chuyển mã điểm chuẩn của Asaph (cảm ơn bài đăng tuyệt vời!) Cho C# và thêm phương thức TryParse. Và dường như, TryParse thắng tay. Tuy nhiên, cách tiếp cận cố gắng nắm lấy một khoảng thời gian điên rồ. Đến mức tôi nghĩ tôi đã làm điều gì đó sai! Tôi cũng đã cập nhật regex để xử lý các điểm âm và thập phân.
Kết quả cho cập nhật, C# mã chuẩn:
00:00:51.7390000 for isIntegerParseInt
00:00:03.9110000 for isIntegerRegex
00:00:00.3500000 for isIntegerTryParse
Sử dụng:
static bool isIntegerParseInt(string str) {
try {
int.Parse(str);
return true;
} catch (FormatException e){}
return false;
}
static bool isIntegerRegex(string str) {
return Regex.Match(str, "^-?[0-9]+(\\.[0-9]+)?$").Success;
}
static bool isIntegerTryParse(string str) {
int bob;
return Int32.TryParse(str, out bob);
}
Tôi nghĩ TryParse là cách tốt nhất –
Đầu vào mong đợi của bạn là gì? Bạn có mong đợi rằng 99% thời gian chuỗi * sẽ * là một con số không, và chỉ 1% thời gian * * sẽ không *? Có còn đường nào khác không? Bạn muốn tối ưu hóa chi nhánh mã thực sự sẽ được thực hiện trong hầu hết các trường hợp. –
Đã thêm, sau đó xóa thẻ C#. :) –