2008-08-01 11 views
50

biri sayı biçimleri olduğunu.Floating Point Number ayrıştırma: Catch All algoritması var mı? Çok kültürlü programlama eğlenceli bölümlerden

  • Amerikalılar 10.000,50
  • Fransız kullanacağım kullanmak 10,000.50
  • Almanları kullanmak 10 000,50

Benim ilk yaklaşım bir karşılaşmaya kadar, dize almak geriye doğru ayrıştırmak olurdu ayırıcı ve bunu ondalık ayırıcım olarak kullan. Bununla bariz bir kusur vardır: 10.000 10.10 olarak yorumlanır.

Başka bir yaklaşım: dizgede 2 farklı sayısal olmayan karakter varsa, ondalık ayırıcı olarak sonuncuyu kullanın ve diğerlerini atın. Sadece bir tane varsa, bir kereden fazla gerçekleşip gerçekleşmediğini kontrol edin ve varsa atın. Sadece bir kez görünürse, ondan sonra 3 haneli olup olmadığını kontrol edin. Varsa, atın, aksi halde ondalık ayırıcı olarak kullanın.

bariz "en iyi çözüm" Kullanıcı kültür veya Tarayıcı algılamak olacaktır, ancak en-ABD Windows/Browser kullanarak bir Fransız varsa o işe yaramaz.

.net Framework çalışırken Double.(Try)Parse() daha iyidir bazı efsanevi kara büyü kayan nokta ayrıştırıcı içeriyor mu sayı biçimini otomatik olarak algılama?

cevap

25

Onların girdi almak ve o zaman onlar demek ne düşündüklerini göstermektir Bu durumda yapabileceğiniz en iyi düşünüyorum. Katılmıyorlarsa, onlara beklediğiniz biçimi gösterin ve tekrar girmelerini sağlayın.

26

Sorunun ASP.NET tarafını bilemem ama .NET oldukça güçlü bir sınıfa sahip: System.Globalization.CultureInfo.

double d = double.Parse("100.20", CultureInfo.CurrentCulture); 
// -- OR -- 
double d = double.Parse("100.20", CultureInfo.CurrentUICulture); 

ASP.NET nasılsa (yani HTTP İstek başlıklarını kullanarak) geçerli kullanıcının Cultureınfo için CultureInfo.CurrentCulture veya CultureInfo.CurrentUICulture, bu olacak ya geçerse: Bir çift değeri içeren bir dize ayrıştırmak için aşağıdaki kodu kullanabilirsiniz İyi çalışmak.

11

Herkesi memnun edemezsiniz. Ben 10.000 olarak ona girmek ve birisi 10.000 olarak on bin girerse, giriş kültürün bazı bilgisi olmadan bu işleyemez. Bir şekilde kültürü (tarayıcı, sistem ayarı - kullanım durumu nedir? ASP? Dahili uygulaması veya dünyaya açılsın mı?) Veya beklenen biçimlendirmenin bir örneğini belirleyin ve mümkün olan en hassas çözümleyiciyi kullanın. Muhtemelen gibi bir şey:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture); 
9

Fransızca ve İngilizce olarak 12.345 arasındaki fark 1000 faktördür. Maksimum menzili < 1000 * min olduğunda, tahmin edebileceğiniz gibi kolayca tahmin edebilirsiniz. Örneğin, bir kişinin (bebekler ve çocuklar dahil) mm cinsinden yüksekliğini ele alalım.

200-3000 arasında bir menzil kullanarak 1.800 veya 1.800'lik bir giriş net olarak 1 metre ve 80 santimetre olarak yorumlanabilirken, 912.300 veya 912.300'lük bir girdi net olarak 91 santimetre ve 2.3 milimetre olarak yorumlanabilir.

İlgili konular