2010-04-27 16 views
11

Biri dışında bilinen tüm bilgisayarlarda iyi çalışan bir yazılım geliştiriyoruz. Sorun, "8" ile başlayan dizeleri ayrıştırmaktır. Bir dizenin başında "8" gibi görünüyor ayrılmış bir karakter.int. "8" hatası başarısız. int.Parse her zaman CultureInfo.InvariantCulture gerektirir?

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 

sorun int.Parse ("8", CultureInfo.InvariantCulture) kullanılarak çözülmüştür. Bununla birlikte, sorunun kaynağını bilmek güzel olurdu.

Soru: Değişmez kültür belirtmezsek neden "8" in bu davranışını alırız?


ek bilgiler:

Yukarıda sonucu elde müvekkilime küçük programı göndermek mi

: Ben tökezledi

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; 
    } 

Güncelleme

Bu bağlantı, microsoft bağlantı veritabanında bir hata: benzer semptomları olan bir sorun, ama gerçek kök neden varmış gibi

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

görünüyor. Eğer bu konuda ayrıntılı bir açıklama yapabilseydim minnettar olurdum!

cevap

21

kültürü için 8, CurrencyNegativePattern numaralı ürünü temsil eder ve bu nedenle açıkladığınız hatayı alırsınız.

Aşağıdaki örnek çalıştırarak kontrol edebilirsiniz:

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

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

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

çıktısı verir:

Açıkça sen Parse kullanarak bir tamsayı ve bir para birimi ayrıştırma olduğunu söyleyebiliriz NumberStyles numaralandırmayı kabul eden aşırı yük.

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

Bu kez tamsayı ayrıştırdığınızı belirttiğinizden beri bir hata oluşmaz.


Ancak IIRC Int32.Parse varsayılan bir tamsayı olarak girdi yorumlamak, yani bunun örnek kodla hata almanızın nedeni beni aşıyor gerekir.


Güncelleme: Son zamanlarda o sorunun dış olmadığından emin olun gerektiğini görünüyor ekledi bilgilerden

.Örneğin, kullanıcı Windows yerel ayarının pozitif işaret ayarını 8 olarak değiştirdiyse, normaldir ve elde ettiğiniz hatayı almanız için mükemmel bir anlam ifade eder. Sadece olumlu bir işaret olarak + ayarlama ve daha sonra bunu ayrıştırmak çalışıyor gibi olacaktır:

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

nfi.PositiveSign = "+"; 

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

o Bağlan sayısında belirtildiği gibi yerel kayıt defteri ayarlarını var kullanıcıdan sormak ve onlar ne beklenir olup olmadığını kontrol edin.

Yan not: SO'ya hoş geldiniz ve bir dahaki sefere bir dahaki sefere daha fazla bilgi eklemeniz gerekir.

+0

Yan not için teşekkürler, ben hallettim :) Kendi yerel ayarları için kayıt defterindeki değerleri daha önce kontrol ettim ve sadece 8 tane hata çoğaltmak yardımcı olan CurrencyNegativePattern var benim makinemde. Doğru yoldan çıktın burada, João. Ancak, bu sorun çok zor ve Microsoft'un da sorunun nedenini bildiğinden emin değilim. Kesinlikle büyük bir UP alıyorsun, ama davranış hala bir gizem. Bu yüzden çabalarınız için minnettar olmama rağmen bir çözüm olarak yanıtı kabul etmiyorum! –

+3

Bu cevabın başlangıcı benim için yanlış görünüyor. "NumberFormatInfo.CurrencyNegativePattern" ve "NumberFormatInfo.CurrencyPositivePattern" değerlerinde bulunan değerler, yalnızca negatif işaret (-), para birimi işareti ve biçimlendirme/ayrıştırma için kullanılacak sayıların sırasını belirlemek için yalnızca anahtar olarak kullanılır. Örneğin, 'CurrencyNegativePattern' değeri olarak '8', desenin '-n $' olması gerektiği anlamına gelir. –

İlgili konular