2009-02-12 23 views
55

Belirli bir dizeyi rasgele karakterlerle doldurmak için String.Format() kullanabilir miyim?Rasgele dizeyle string.format (padleft veya padright değil) ile sağa veya sola kaydırma

Console.WriteLine("->{0,18}<-", "hello"); 
Console.WriteLine("->{0,-18}<-", "hello"); 

returns 

->    hello<- 
->hello    <- 

şimdi alanlarda keyfi bir karakter olmak istiyorum. PadLeft veya padRight ile yapamamın nedeni, format dizisini farklı bir yerde/saatte yapılandırabilmem ve biçimlendirmenin gerçekte yürütüldüğünden dolayıdır.

--EDIT--

ihtiyacım
--EDIT2--
sorunuma varolan çözüm I ( Think Before Coding's suggestion sonra) bu geldi orada görünmüyor Görülme kod, bir ana fikri olarak github için bir yazı koymak için çok fazla biraz taşındı Çünkü biraz daha karmaşık senaryolar yüzden Think Before Coding's second suggestion

[TestMethod] 
public void PaddedStringShouldPadLeft() { 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0:20:x} {1}<-", "Hello", "World"); 
    string expected = "->xxxxxxxxxxxxxxxHello World<-"; 
    Assert.AreEqual(result, expected); 
} 
[TestMethod] 
public void PaddedStringShouldPadRight() 
{ 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0} {1:-20:x}<-", "Hello", "World"); 
    string expected = "->Hello Worldxxxxxxxxxxxxxxx<-"; 
    Assert.AreEqual(result, expected); 
} 
[TestMethod] 
public void ShouldPadLeftThenRight() 
{ 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0:10:L} {1:-10:R}<-", "Hello", "World"); 
    string expected = "->LLLLLHello WorldRRRRR<-"; 
    Assert.AreEqual(result, expected); 
} 
[TestMethod] 
public void ShouldFormatRegular() 
{ 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0} {1:-10}<-", "Hello", "World"); 
    string expected = string.Format("->{0} {1,-10}<-", "Hello", "World"); 
    Assert.AreEqual(expected, result); 
} 

gitti:
http://gist.github.com/533905#file_padded_string_format_info

İnsanların kolayca şube ve her ne :)

+0

ben

public class StringPadder : ICustomFormatter { public string Format(string format, object arg, IFormatProvider formatProvider) { // do padding for string arguments // use default for others } } public class StringPadderFormatProvider : IFormatProvider { public object GetFormat(Type formatType) { if (formatType == typeof(ICustomFormatter)) return new StringPadder(); return null; } public static readonly IFormatProvider Default = new StringPadderFormatProvider(); } 

Sonra bu gibi kullanabilirsiniz:

String.format geçilecek bir ICustomFormatter dönmek için IFormatProvider Uygulamak dizenin boş olmadığından emin olmalısınız. Testten geçer: dizesi.Fomat ("{0}", (PaddedString) "Merhaba"); ? – configurator

cevap

30

başka bir çözüm yoktur.

string.Format(StringPadderFormatProvider.Default, "->{0:x20}<-", "Hello"); 
+0

Bu, birden çok bağımsız değişkenin biçimlendirilmesine izin verir. Güncelleştirilmiş OP. GetFormat için –

+0

parametresi (Tür tipi) yerine (Type typeType) olmalıdır. – demokritos

2

Düzenleme edebilirsiniz: Sorunuzu yanlış, sana nasıl boşluklar kullanılır isteyen sanıyordum.

Ne soruyorsunuz string.Format hizalama bileşenini kullanarak mümkün değildir; string.Format her zaman beyaz boşluklu pedler. MSDN: Composite Formatting'un Hizalama Bileşeni bölümüne bakın. Gördüğünüz gibi, boşlukları sert boşluk doldurulacak şekilde kodlanır

int repeatCount = num6 - str2.Length; 
if (!flag && (repeatCount > 0)) 
{ 
    this.Append(' ', repeatCount); 
} 
this.Append(str2); 
if (flag && (repeatCount > 0)) 
{ 
    this.Append(' ', repeatCount); 
} 

:

Reflektör göre bu string.Format tarafından çağrılan StringBuilder.AppendFormat(IFormatProvider, string, object[]) içinde çalışır koddur.

+0

Soruyu yanlış anladım ... – configurator

+0

Sayılarla mümkündür .. Sayılarla mümkün olsa ve dizelerle olmasa bile aptalca düşünürdüm. –

+0

Sayılarla nasıl mümkün olabilir? – configurator

11

Sen IFormattable

public struct PaddedString : IFormattable 
{ 
    private string value; 
    public PaddedString(string value) { this.value = value; } 

    public string ToString(string format, IFormatProvider formatProvider) 
    { 
     //... use the format to pad value 
    } 

    public static explicit operator PaddedString(string value) 
    { 
    return new PaddedString(value); 
    } 
} 

Sonra böyle kullanacağız uygulayan bir yapı içinde dize encapsulate olabilir:

string.Format("->{0:x20}<-", (PaddedString)"Hello"); 

sonucu:

"->xxxxxxxxxxxxxxxHello<-" 
3

Basit:

 


    dim input as string = "SPQR" 
    dim format as string ="" 
    dim result as string = "" 

    'pad left: 
    format = "{0,-8}" 
    result = String.Format(format,input) 
    'result = "SPQR " 

    'pad right 
    format = "{0,8}" 
    result = String.Format(format,input) 
    'result = " SPQR" 

 
İlgili konular