2009-02-12 10 views
55

क्या मैं स्ट्रिंग.फॉर्मैट() का उपयोग मनमाने ढंग से वर्णों के साथ एक निश्चित स्ट्रिंग को पैड करने के लिए कर सकता हूं?पैड बाएं या दाएं स्ट्रिंग.फॉर्मैट (पैड बाएं या पैडराइट) के साथ मनमानी स्ट्रिंग

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

returns 

->    hello<- 
->hello    <- 

अब मैं रिक्त स्थान को मनमाना चरित्र बनना चाहता हूं। कारण मैं पैडलिफ्ट या पैडराइट के साथ ऐसा नहीं कर सकता क्योंकि मैं प्रारूप स्ट्रिंग को किसी भिन्न स्थान/समय पर बनाने में सक्षम होना चाहता हूं, तो स्वरूपण वास्तव में निष्पादित किया जाता है।

--EDIT--
देखा है कि वहाँ मेरी समस्या के लिए एक मौजूदा समाधान मैं इस के साथ आया था (Think Before Coding's suggestion के बाद)
--EDIT2--
मैं जरूरत होने के लिए प्रतीत नहीं होता कुछ और अधिक जटिल स्थितियों तो मैं 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); 
} 

के लिए चला गया क्योंकि कोड था भी एक पोस्ट में डाल करने के लिए बहुत थोड़ा है, मैं यह GitHub के लिए एक सार रूप में ले जाया गया:
http://gist.github.com/533905#file_padded_string_format_info

ऐसे लोग आसानी से इसे और शाखा कर सकते हैं जो कुछ भी :)

+0

मैं

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(); } 

तो फिर तुम इसे इस तरह उपयोग कर सकते हैं लगता है कि आपको यह सुनिश्चित करना चाहिए कि स्ट्रिंग खाली नहीं है। क्या यह परीक्षण पास करेगा: स्ट्रिंग।फ़ामेट ("{0}", (पैडडस्ट्रिंग) "हैलो"); ? – configurator

उत्तर

30

एक और उपाय है।

लागू IFormatProvider एक ICustomFormatter कि String.Format को दे दिया जाएगा वापस जाने के लिए:

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

यह एक से अधिक तर्कों को स्वरूपित करने की अनुमति देता है। अद्यतन ओपी। GetFormat के लिए –

+0

पैरामीटर (प्रकार प्रकार) के बजाय पैरामीटर (टाइप प्रकार टाइप करें) होना चाहिए। – demokritos

2

संपादित करें: मैं आपके सवाल का गलत समझा, मैंने सोचा था कि आप कैसे रिक्तियों के साथ पैड को पूछ रहे थे।

आप जो पूछ रहे हैं string.Format संरेखण घटक का उपयोग करना संभव नहीं है; string.Format हमेशा सफेद जगह के साथ पैड। संरेखण घटकMSDN: Composite Formatting का अनुभाग देखें।

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

आप देख सकते हैं, कारतूस कठिन सफेद स्थान के साथ भरे जाने के लिए कोडित रहे हैं:

परावर्तक के अनुसार, इस कोड है कि StringBuilder.AppendFormat(IFormatProvider, string, object[]) अंदर चलाता है जो string.Format द्वारा कहा जाता है।

+0

मैंने प्रश्न को गलत समझा ... – configurator

+0

यह संख्याओं के साथ संभव है .. मुझे लगता है कि यह वास्तव में बेवकूफ है अगर यह संख्याओं के साथ संभव है और स्ट्रिंग के साथ नहीं। –

+0

संख्याओं के साथ यह कैसे संभव है? – configurator

11

आप एक struct लागू करता है कि 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); 
    } 
} 

तो है कि इस प्रकार का प्रयोग स्ट्रिंग संपुटित सकता है:

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

परिणाम:

"->xxxxxxxxxxxxxxxHello<-" 
3

सरल::

 


    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" 

 
संबंधित मुद्दे