2011-05-29 20 views
5

XML dosyalarından rakam okuyorum. Diğer sayılar virgülle ayırıcı (0,1111) ve nokta (0.1111) ile diğerleridir. Bu sayıları nasıl ayrıştıracağım ki sonunda istenen sonucu aldım? float.Parse(reader.Value, System.Globalization.CultureInfo.InvariantCulture); kullanmayı denedim ama işe yaramıyor. Örneğin ben reader.Value = "0,01119703" var ve 1119703.0 olarak ayrıştırıldı.C# dizgeden ayrıştırma float

+0

Bunun nasıl ayrıştırılmasını istiyorsunuz? – soandos

+0

Size böyle garip veriler kim veriyor? Görünüşe göre gerçek sorun kaynakta ... – Cameron

+0

@soandos Float numarası olarak ayrıştırılmasını istiyorum. Aslında bu dize. – user579674

cevap

10

Aynı anda iki farklı ondalık ayırıcıyla çalışmanın mümkün olduğuna inanmıyorum. Sanırım herhangi bir virgüyü noktaya dönüştürmek için sadece Replace() kullanıyorum.

float.Parse(reader.Value.Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture); 
+0

olan bir dizi dizeleri olduğunu varsayalım. Bu yaklaşımla bir risk, sayıların 1000.00 –

+0

biçiminde olması halinde olurdu. Bu biraz tehlikeli. "3,456.78" girerseniz, yukarıdaki kod muhtemelen "3.456.78" olarak değiştirilecek ve bu muhtemelen bir ayrıştırma hatasıyla sonuçlanacaktır. –

+0

Bu bir seçenek değil. Kaynağın hiçbirini değiştiremem. – user579674

2

XML dosyalarında hangi biçimin kullanıldığını size söyleyen bir şey var mı? .NET'te, izin verilen iki ondalık ayırıcıya sahip olmak için yerleşik bir yol yoktur. Bir sayının hangi formatta olacağını belirten bir şey yoksa, her zaman dizenin bir nokta mı yoksa virgül mi içerdiğini ve ondalık ayırıcıyla bir NumberFormatInfo oluşturup oluşturmadığını kontrol edebilirsiniz. Tabii ki, bu sayılardan herhangi birinin bir binlik ayırıcı olarak bir periyodu veya virgülü olması durumunda işe yaramaz.

+0

Bunlar küçük sayılardır, muhtemelen bin ayırıcı yoktur. Virgül veya nokta olup olmadığını nasıl kontrol edebilirim? Bu karakterleri içeriyorsa dizeyi kontrol etmem gerekiyor mu? – user579674

+0

Hiçbir şey kontrol etmek zorunda değilsiniz, sadece Replace() işlevini kullanın. Değiştirilecek karakteri bulamazsa, orijinal dizeyi döndürür. Cevabımın içerdiği kodu görüyorum :-) – AHM

4

Bunun en büyük çözüm olduğundan emin değilsiniz, ancak bilinen bir dizi "Özel" sayı biçimine güvenebilirsiniz. Örneğin, iki özel sayı biçimleri (ya sıfırdan ya da bilinen bir biçimi dayalı çalışma) beyan gibi olabilir:

private static readonly NumberFormatInfo DecimalSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "," }; 
private static readonly NumberFormatInfo CommaSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ",", NumberGroupSeparator = "." }; 

Ve sonra bilinen kabul biçimleri kullanarak numarayı ayrıştırma deneyin:

if (!Single.TryParse(unparsedValue, NumberStyles.Float, DecimalSeparatorFormat, out parsedValue) && !Single.TryParse(unparsedValue, NumberStyles.Float, CommaSeparatorFormat, out parsedValue)) 
    throw new FormatException("Number format not supported"); 

Bu, sınırlı sayıda bilinen biçime sahip olduğunuzu varsayar, eğer girdileriniz gerçekten herhangi bir kültürde olabilirse, o zaman harika bir çözüm bulma şansınız olmayabilir.

Bu yaklaşıma sahip tek kazanım, en azından basit bir dize yerine (bu geçersiz bir biçime neden olabilir) güvenmek yerine, destekleyebildiğiniz biçimlerde açıkça belirtmenizdir.