2010-05-20 15 views
5

Çok basit bir sorum var ve buna asılmamalıyım, ama öyleyim. Haha!Aşağıdaki dizeyi biçimlendirmenin en etkili yolu nedir?

123456-D53

123455-4D

234234-4

123415:

ben aşağıdaki biçimde (ler) aldığınız bir dize var

İstenen çıktı, biçimlendirme formatı:

123-455-444

123-455-55

123-455-5

veya

123-455

biçimi üzerine nihai bağlıdır orijinal dizgede toplam karakter sayısı ..

Ben var ral Bunun nasıl fikirleri, ama String.Replace daha iyi bir yolu var olanı korumak ve bitiştirmek ... önerileri için

Teşekkür ..

Ian

+6

Eğer verimlilik örneği okunabilirlik için buraya değil en önemli ölçüt olduğundan emin misin? Bunun programınızdaki darboğaz olduğunu görecek misiniz? –

+1

Her iki hesapta da yok. Aslında, bir darboğaz olmadığını ve verimliliğin en önemli metrik olmadığından eminim. Sadece merak ediyorum ve bütün gün bunu düşünüyorum. :) –

cevap

2

Bunun, yalnızca her zaman sayısal olan girdilere dayanmadığını varsayıyorum. Eğer öyleyse, bu

private string ApplyCustomFormat(string input) 
{ 
    StringBuilder builder = new StringBuilder(input.Replace("-", "")); 

    int index = 3; 
    while (index < builder.Length) 
    { 
     builder.Insert(index, "-"); 
     index += 4; 
    } 
    return builder.ToString(); 
} 
+0

Bu benim uygulamanıza benzer .. Sadece "Bu bunu yapmanın en verimli yolu nedir?" soru .. –

+0

@Ian P - "en verimli", "yeterince verimli" olmaktan daha az önemlidir. İlk yorumu görün. Ben bir IEnumerable chunker (yöntem veya Regex) ve String.Join ;-) kullanan "daha az verimli" kod yazmak için cazip olurdu ;-) –

+0

Anlattığım spec başına ilk olarak çalıştığı gibi, bunu cevap olarak aldı. Diğer posterler de kodlarını gerektiği gibi çalışacak şekilde güncellediler. Tüm yeşil onay işaretlerine layık, ama ben sadece bir tane verebilirim :) –

2

DÜZENLEME: için geçmişine bakın Eski versiyonlar.
Yalnızca rakamları bulmak için char.IsDigit()'u kullanabilirsiniz. soldan sağa

var output = new StringBuilder(); 
var digitCount = 0; 

foreach(var c in input) 
{ 
    if(char.IsDigit(c)) 
    { 
    output.Append(c); 
    digitCount++; 
    if(digitCount % 3 == 0) 
    { 
     output.Append("-"); 
    } 
    } 
} 

// Remove possible last - 
return output.ToString().TrimEnd('-'); 

Bu kod doldurmalıdır
Üzgünüm, hala şimdi bu hakkı test edemez ... (şimdi ben, ilk okuma, ardından kod got it).

+0

Orijinal yazıya açıklık getirmek üzereyim, dize yalnızca sayısal değil, alfasayısal olabilir. –

+0

Sanırım bu rakamları yanlış yönde dolduruyor. Konuşmak için Sola Yaslanmış olmasını istiyor. – user7116

+0

@Ian: Şimdi char.IsDigit kullanıyorum. @sixlettervariables: Haklısınız, bu onu çok daha zorlaştırıyor. – tanascius

4

Tanascius gibi bir şey düşünüyorum haklı ama nedeniyle temsilcisi benim eksikliği yorumum veya upvote olamaz ama String.Format üzerinde ek bilgi isterseniz Ive bu yararlı buldu. gözleri http://blog.stevex.net/string-formatting-in-csharp/

+0

Harika bağlantı, teşekkürler. –

+0

Cevabımı sildiğimi bilmem gerekirdi :-). OP, soruyu değiştirdi ve artık geçerli değil. Üstelik, altıuncu değişkeni aslında asıl soruya da cevap vermediğine işaret etti. –

0

Değil en hızlı, ama kolay (ed: okumak için):

string Normalize(string value) 
{ 
    if (String.IsNullOrEmpty(value)) return value; 

    int appended = 0; 
    var builder = new StringBuilder(value.Length + value.Length/3); 
    for (int ii = 0; ii < value.Length; ++ii) 
    { 
     if (Char.IsLetterOrDigit(value[ii])) 
     { 
      builder.Append(value[ii]); 
      if ((++appended % 3) == 0) builder.Append('-'); 
     } 
    } 

    return builder.ToString().TrimEnd('-'); 
} 

StringBuilder 'ın uzunluğu önceden tahsis etmek bir tahmin kullanır. Bu, fazladan boşluk dahil olmak üzere kullanıcı tarafından eklenen gereksiz miktardaki Alfanümerik girdiyi kabul edecektir.

+6

Haha, farklı gözlere sahip olmalıyız: p –

+0

'(ii + 1)% 3 == 0' için kontrol etmelisiniz. –

+0

@ 0xA3: iyi yakalama. @pst: Bunu okumak için geri dönersem, neler olduğu belli olacak. Tıkanıklık yok;) – user7116

2

Bir seferde üç harften oluşan grupları ayıklamak ve sonra yeniden birleştirmek için düzenli ifadelerin ve LINQ bileşiminin kullanıldığı bir yöntem. Not: girdinin zaten doğrulanmış olduğunu varsayar.Doğrulama, normal bir ifadeyle de yapılabilir.

string s = "123456-D53"; 
string[] groups = Regex.Matches(s, @"\w{1,3}") 
         .Cast<Match>() 
         .Select(match => match.Value) 
         .ToArray(); 
string result = string.Join("-", groups); 

Sonuç:

 
123-456-D53 
İlgili konular