2010-04-27 16 views
11

Chúng tôi phát triển một phần mềm được thiết lập hoạt động tốt trên tất cả các máy tính đã biết ngoại trừ một máy tính. Vấn đề là phân tích chuỗi bắt đầu bằng "8". Có vẻ như "8" ở đầu chuỗi là ký tự dành riêng.int.Parse của "8" không thành công. int.Parse luôn yêu cầu CultureInfo.InvariantCulture?

Parsing: 
int.Parse("8") -> Exception message: Input string was not in a correct format. 
int.Parse("80") -> 0 
int.Parse("88") -> 8 
int.Parse("8100") -> 100 

CurrentCulture: sv-SE 
CurrentUICulture: en-US 

Vấn đề được giải quyết bằng int.Parse ("8", CultureInfo.InvariantCulture). Tuy nhiên, nó sẽ được tốt đẹp để biết nguồn gốc của vấn đề.

Câu hỏi: Tại sao chúng ta có hành vi này "8" nếu chúng ta không chỉ định văn hóa bất biến?


thông tin bổ sung:

tôi đã gửi một chương trình nhỏ để khách hàng của tôi đạt được kết quả trên:

private int ParseInt(string s) 
    { 
     int parsedInt = -1000; 
     try 
     { 
      parsedInt = int.Parse(s); 

      textBoxMessage.Text = "Success: " + parsedInt; 

     } 
     catch (Exception ex) 
     { 
      textBoxMessage.Text = 
       string.Format("Error parsing string: '{0}'", s) + Environment.NewLine + 
       "Exception message: " + ex.Message; 
     } 

     textBoxMessage.Text += Environment.NewLine + Environment.NewLine + 
      "CurrentCulture: " + Thread.CurrentThread.CurrentCulture.Name + "\r\n" + 
      "CurrentUICulture: " + Thread.CurrentThread.CurrentUICulture.Name + "\r\n"; 
     return parsedInt; 
    } 

Cập nhật

tôi stumbled trên liên kết này, một lỗi trong cơ sở dữ liệu kết nối microsoft:

https://connect.microsoft.com/VisualStudio/feedback/details/253265/int32-parse-fails-to-convert-the-string-0-zero-on-some-systems

Nó có vẻ như có một vấn đề với các triệu chứng tương tự, nhưng không có nguyên nhân gốc rễ thật sự. Nếu bất cứ ai có thể giải thích về điều này tôi sẽ biết ơn!

Trả lời

21

Đối với văn bản sv-SE8 đại diện cho CurrencyNegativePattern và đó là lý do bạn nhận được lỗi mà bạn mô tả.

Bạn có thể kiểm tra điều này bằng cách chạy ví dụ sau:

var ci = new CultureInfo("sv-SE"); 

var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); 

Console.WriteLine(nfi.CurrencyNegativePattern); 
Console.WriteLine(nfi.CurrencyPositivePattern); 

Sản lượng này sẽ:

Bạn rõ ràng có thể nói rằng bạn đang phân tích một số nguyên và không một đồng tiền bằng công Parse quá tải chấp nhận một điều tra NumberStyles.

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE")); 

Lần này vì bạn đang chỉ định rằng bạn đang phân tích cú pháp một số nguyên không có lỗi xảy ra.


Tuy nhiên, IIRC Int32.Parse nên giải thích các đầu vào là một số nguyên theo mặc định, vậy tại sao bạn đang nhận được để các lỗi với mẫu mã là ngoài tôi.


Cập nhật:

Từ thông tin bạn vừa thêm vào có vẻ như bạn nên chắc chắn rằng vấn đề không phải là bên ngoài.Đây là, nếu người dùng ví dụ thay đổi các thiết lập dấu hiệu tích cực của các cửa sổ miền địa phương để 8 nó sẽ là bình thường và làm cho cảm giác hoàn hảo cho bạn để có được lỗi bạn đang có được. Nó sẽ giống như thiết lập các + là dấu hiệu tích cực và sau đó cố gắng để phân tích nó:

var ci = new CultureInfo("sv-SE"); 
var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); 

nfi.PositiveSign = "+"; 

Int32.Parse("+", nfi); // This will throw 

Hỏi người sử dụng cho nó thiết lập registry locale như đã nêu trong vấn đề kết nối và kiểm tra xem họ là những gì bạn mong đợi.

Lưu ý phụ: Chào mừng bạn đến với SO và bằng cách này bạn cần phải thêm thông tin vào câu hỏi tiếp theo của bạn, bạn nên chỉnh sửa nó thay vì cung cấp câu trả lời.

+0

Cảm ơn ghi chú bên, tôi đã quan tâm đến nó :) Tôi đã kiểm tra trước đó các giá trị trong sổ đăng ký cho cài đặt ngôn ngữ của mình và chỉ 8 ra có CurrencyNegativePattern không giúp tôi tạo lại lỗi trên máy tính của tôi. Bạn chắc chắn đã đi đúng hướng ở đây João. Tuy nhiên, vấn đề này là một vấn đề khó khăn và tôi không chắc Microsoft cũng biết lý do của vấn đề này. Bạn đang nhận được một UP lớn chắc chắn, nhưng hành vi vẫn còn là một bí ẩn. Đó là lý do tại sao tôi không chấp nhận bạn trả lời như một giải pháp mặc dù tôi rất biết ơn nỗ lực của bạn! –

+3

Sự bắt đầu của câu trả lời này có vẻ sai với tôi. Các giá trị trong 'NumberFormatInfo.CurrencyNegativePattern' và' NumberFormatInfo.CurrencyPositivePattern' chỉ được sử dụng làm khóa - để xác định thứ tự dấu âm (-), ký hiệu tiền tệ và chính số sẽ được sử dụng để định dạng/phân tích cú pháp. Ví dụ: '8' làm giá trị của 'CurrencyNegativePattern' có nghĩa là mẫu phải là '-n $'. –

Các vấn đề liên quan