2009-06-18 14 views
10

Tôi có tệp văn bản, mà tôi sử dụng để nhập thông tin vào ứng dụng của mình. Vấn đề là một số giá trị đang nổi và đôi khi chúng là rỗng, đó là lý do tôi có ngoại lệ.float.Parse() không hoạt động theo cách tôi muốn

 var s = "0.0"; 
     var f = float.Parse(s); 

Mã ở trên ném ngoại lệ tại dòng 2 "Chuỗi đầu vào không đúng định dạng".

Tôi tin rằng giải pháp sẽ là quá tải nâng cao của float.Parse, bao gồm IFormatProvider như một tham số, nhưng tôi chưa biết gì về nó.

Làm cách nào để phân tích cú pháp "0.0"?

+0

Tôi đã thử mã của bạn và có thể phân tích cú pháp giá trị. –

+3

Mã này phụ thuộc vào văn hóa (ví dụ: phụ thuộc miền địa phương). Vì vậy, một số người trong chúng ta sẽ không thấy hành vi này. – inazaruk

Trả lời

22

Ký hiệu chấm "." không được sử dụng làm dấu phân tách (điều này phụ thuộc vào cài đặt văn hóa). Vì vậy, nếu bạn muốn hoàn toàn chắc chắn rằng dấu chấm được phân tích chính xác, bạn cần phải viết một cái gì đó như thế này:

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
ci.NumberFormat.CurrencyDecimalSeparator = "."; 
avarage = double.Parse("0.0",NumberStyles.Any,ci); 
+0

Tôi rất xin lỗi vì sự trả lời trễ (tôi đã chấp nhận câu trả lời của bạn ngay bây giờ), nhưng tôi đã bận rộn. Cảm ơn câu trả lời của bạn, nó làm những gì tôi cần. Tôi thực sự đánh giá cao nó. –

+2

CultureInfo.InvariantCulture là tốt hơn. (xem bên dưới) –

2

Tôi vừa thử điều này và nó không hề ném bất kỳ ngoại lệ nào.

Định dạng số của bạn có sử dụng dấu phẩy thập phân thay vì dấu thập phân không? Bạn đã thử:

var s = "0,0"; 
var f = float.Parse(s); 

Đã hỏi điều này tôi vừa thử với dấu phẩy mong nhận được ngoại lệ, nhưng không. Vì vậy, đây có thể không phải là câu trả lời.

+0

Ngoại lệ có thể được tạo ra với ngôn ngữ đúng, ví dụ như tiếng Anh. – Akku

+0

@Akku - Tôi không nhớ chính xác bài kiểm tra tôi đã làm (tôi đã đăng câu trả lời này cách đây 2 1/2), nhưng tôi biết về ngôn ngữ và cách chúng ảnh hưởng đến việc phân tích số. Tôi đã đề xuất cho người dùng rằng * miền địa phương của anh ấy đã được đặt thành một dấu phẩy thập phân được mong đợi thay vì dấu thập phân. – ChrisF

+0

[câu hỏi mới] này (http://stackoverflow.com/questions/8883801/double-tryparse-ignores-numberformatinfo-numbergroupsizes) có thể giải thích tại sao tôi nhận được kết quả thay vì ngoại lệ. – ChrisF

2

Hoặc, bạn có thể chỉ cần kiểm tra xem văn bản đầu vào có rỗng hay không.

Ngoài ra, hãy cẩn thận, vì ở một số quốc gia, "." (dấu chấm) phân tách các số phao là "," (dấu phẩy)

+0

Trên thực tế, dấu chấm của nó và nó không hoạt động. Khi tôi thay đổi nó thành dấu phẩy, nó hoạt động. Tôi có thể phải thay đổi toàn bộ tệp. –

+1

Không, bạn không. Bạn có thể thiết lập dấu chấm để được nhận dạng là dấu phân tách tùy chỉnh. – inazaruk

+0

Thú vị, nhưng làm thế nào? –

6

Bạn có thể kiểm tra chuỗi rỗng hoặc trống trước.

Bạn cũng có thể sử dụng một trong các tình trạng quá tải của Parse (hoặc thậm chí sử dụng TryParse) để kiểm soát cụ thể hơn.

Ví dụ: để kiểm tra bằng cách sử dụng văn hóa invarient, để tránh biến thể tách số thập phân với các dữ liệu có thể nhìn thấy không sử dụng (ví dụ như từ A2A thông tin liên lạc):

float SafeParse(string input) { 
    if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); } 

    float res; 
    if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) { 
    return res; 
    } 

    return 0.0f; // Or perhaps throw your own exception type 
} 
3

công trình sau cho tôi:

string stringVal = "0.0"; 
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat); 

Trường hợp ngược lại (chỉ hoạt động cho tất cả coutries):

float floatVal = 0.0f; 
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat); 
Các vấn đề liên quan