2012-06-16 13 views
10

5.5kg veya 7.90gram gibi bir dize var ve ben 5.5 veya 7.90 ondalık bir değer olarak almak istiyorum. Böyle bir sonucu C# ve dizgimin her zaman ondalık ile başlayacağı bir şeyden nasıl alabilirim.Dize başlangıcından itibaren ondalık ayırma

Ondalık dışında bir şeyle karşılaşacağı zaman hata veren kodum İşte.

string weight = attributeValue; 
if (!string.IsNullOrEmpty(weight)) 
{ 
    product.Weight = Convert.ToDecimal(attributeValue); 
} 
else 
{ 
    product.Weight = 0.00m; 
} 
+0

Kullanım TryParse() 'dir. –

cevap

28

Öncelikli numara bölümüne uyan düzenli bir ifade oluşturur.

: Bu kısmen seçeneğin her zaman vb ondalık noktasının yanı . kullanacak olsa bu gibi görünebilir, ister binlerce ayırıcılar için virgül izin isteyip, sen hep ondalık nokta olacak mı bağlıdır
^-?\d+(?:\.\d+)? 

Sonra (başarılı ise) maçın değerini almak, metninizin karşı düzenli ifade eşleşmesi ve bu değerde decimal.Parse veya double.Parse kullanın:

Regex regex = new Regex(@"^-?\d+(?:\.\d+)?"); 
Match match = regex.Match(text); 
if (match.Success) 
{ 
    weight = decimal.Parse(match.Value, CultureInfo.InvariantCulture); 
} 

Not böyle bir kitle olarak "doğal" değerleri için sen , double ile decimal'dan daha iyi olabilir. İkincisi, ondalık olarak doğal olarak en iyi ifade edilen ve kesin değerlere sahip olan para birimi gibi "yapay" değerler için daha uygundur. Ne yaptığına bağlı. senin girdi dizesi farklı bir biçimde olup olmadığını girdi biçimi için

+0

Geçerli normal ifade, '^ ankrajı nedeniyle dizenin başlangıcında yalnızca şamandıralarla/tam sayılarla eşleşecektir. Dizede herhangi bir konumdan numara ayıklamak için '-? \ D + (?: \. \ D +)?' Tuşlarını kullanın. Veya '[- +]? [0-9] * \.? [0-9] + (?: [EE] [- +]? [0-9] +)?' –

+0

@ WiktorStribiżew: Yup, çünkü ben sorulan soruyu yanıtladı: "dizgimin her zaman ondalık ile başlayacağı bir şey daha". –

+0

Evet, elbette, sadece başlık, bunun düzenlenmesinin gerekli olduğunu ima etmez. –

0

o zaman regex deseni değiştirmek zorunda bu kodla

var weight =Decimal.Parse(Regex.Match(input_string, "[0-9]*\\.*[0-9]*").Value); 

ondalık alabilirsiniz.

2

burada bambaşka bir yaklaşımdır

string oldstr = "1.7meter"; 
     Char[] strarr = oldstr.ToCharArray().Where(c => Char.IsDigit(c) || Char.IsPunctuation(c)).ToArray(); 
     decimal number = Convert.ToDecimal(new string(strarr)); 
İlgili konular