2010-11-05 12 views
12

कि कैसे करना है नहीं मिला। जो मैंने पाया वह इस (http://blog.stevex.net/string-formatting-in-csharp/) की लाइनों पर कम या कम था:वर्णों की अधिकतम संख्या सी printf में की तरह सी # प्रारूप तार में परिभाषित किया जा सकता है?

वास्तव में इसके संरेखण से परे स्ट्रिंग के भीतर कोई स्वरूपण नहीं है। संरेखण किसी स्ट्रिंग.फॉर्मेट कॉल में मुद्रित किसी भी तर्क के लिए काम करता है। नमूना उत्पन्न

String.Format(“->{1,10}<-”, “Hello”); // gives "->     Hello<-" (left padded to 10) 
String.Format(“->{1,-10}<-”, “Hello”); // gives "->Hello     <-" (right padded to 10) 
+0

वास्तव में क्या आप प्राप्त करने की कोशिश कर रहे हैं? क्या आप उन उदाहरणों को पोस्ट कर सकते हैं जिन्हें आप देखना चाहते हैं? – Oded

+0

मैं सी प्रारूप स्ट्रिंग्स को सी # प्रारूप स्ट्रिंग में कनवर्ट करने की कोशिश कर रहा हूं। सी में आप% -4.4s और इसी तरह निर्दिष्ट कर सकते हैं। –

+0

नीचे वोट क्यों? यह आवश्यक सवाल है! –

उत्तर

7

तुम क्या चाहते नहीं "मूल रूप से" सी # स्ट्रिंग स्वरूपण द्वारा समर्थित है, स्ट्रिंग वस्तु की String.ToString तरीकों सिर्फ स्ट्रिंग लौटाने खुद के रूप में है।

जब आप

string.Format("{0:xxx}",someobject); 

फोन someobject IFormattable इंटरफ़ेस लागू करता है, अधिभार ToString(string format,IFormatProvider formatProvider) विधि कहा जाता हो जाता है, format पैरामीटर के रूप में "xxx"।

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

आप वास्तव में इस की जरूरत है, तो आप सुझाव दिया समाधान के किसी भी उपयोग करें, या IFormattable इंटरफेस को लागू करने के लिए अपने ही वर्ग बना सकते हैं।

+0

धन्यवाद है! आप निश्चित रूप से सही हैं। यह स्ट्रिंग क्लास है जिसमें कुछ कमी है। लेकिन यू कुछ प्रारूप का एक उदाहरण के रूप में xxx का उपयोग किया था या यह वास्तव में कुछ (जैसे 3 अक्षरों) मतलब है? –

+0

@matti, कोई xxx सिर्फ एक उदाहरण था। दरअसल, IFormattable इंटरफ़ेस के कार्यान्वयन के द्वारा इसका क्या अर्थ है।); वैसे भी, स्ट्रिंग सी # में एक की तुलना में ग में स्वरूपण ++ * बेकार *, तथ्य यह है कि इस विशेष सुविधा याद आ रही है के लिए एक दोष के बारे में बात मेरे लिए नहीं बल्कि अजीब लगता है (एक सी ++ प्रेमी के रूप में बोल) –

0

तुम सिर्फ पैरामीटर के बजाय प्रारूप का उपयोग कर लंबाई तर्क लागू नहीं कर सकते हैं?

स्ट्रिंग.फॉर्मेट ("-> {0} < -", toFormat.PadRight (10)); // -> हैलो < -

या अपनी फ़ॉर्मेटर आपको ऐसा करने की अनुमति देने के लिए लिखना?

+0

सी टिप्पणी –

0

क्यों नहीं सिर्फ अपने स्ट्रिंग की लंबाई सीमित करने के लिए substr का उपयोग करें?

String s = "abcdefghijklmnopqrstuvwxyz"; 
String.Format("Character limited: {0}", s.Substr(0, 10)); 
+0

सी टिप्पणी नहीं। मैं इस समाधान का इस्तेमाल किया के रूप में यह है और यह विफल रहता है, जब स्ट्रिंग से कम 10 अक्षर ... –

+0

सवाल करने के लिए मैं इस तथ्य भी substr कुछ अजीब कार्यान्वयन हर दूसरे भाषा से अलग है कि याद किया पर सवाल उठाने –

0

मैंने एक कस्टम फॉर्मेटर लिखा है जो अधिकतम चौड़ाई निर्धारित करने के लिए उपयोग किए जाने वाले "एल" प्रारूप विनिर्देशक को लागू करता है। यह तब उपयोगी होता है जब हमें हमारे स्वरूपित आउटपुट के आकार को नियंत्रित करने की आवश्यकता होती है जब डेटाबेस कॉलम या डायनेमिक्स सीआरएम फ़ील्ड के लिए नियत किया जाता है।

public class StringFormatEx : IFormatProvider, ICustomFormatter 
{ 
    /// <summary> 
    /// ICustomFormatter member 
    /// </summary> 
    public string Format(string format, object argument, IFormatProvider formatProvider) 
    { 
     #region func-y town 
     Func<string, object, string> handleOtherFormats = (f, a) => 
     { 
      var result = String.Empty; 
      if (a is IFormattable) { result = ((IFormattable)a).ToString(f, CultureInfo.CurrentCulture); } 
      else if (a != null) { result = a.ToString(); } 
      return result; 
     }; 
     #endregion 

     //reality check. 
     if (format == null || argument == null) { return argument as string; } 

     //perform default formatting if arg is not a string. 
     if (argument.GetType() != typeof(string)) { return handleOtherFormats(format, argument); } 

     //get the format specifier. 
     var specifier = format.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture); 

     //perform extended formatting based on format specifier. 
     switch(specifier) 
     { 
      case "L": 
       return LengthFormatter(format, argument); 
      default: 
       return handleOtherFormats(format, argument); 
     } 
    } 

    /// <summary> 
    /// IFormatProvider member 
    /// </summary> 
    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 
     else 
      return null; 
    } 

    /// <summary> 
    /// Custom length formatter. 
    /// </summary> 
    private string LengthFormatter(string format, object argument) 
    { 
     //specifier requires length number. 
     if (format.Length == 1) 
     { 
      throw new FormatException(String.Format("The format of '{0}' is invalid; length is in the form of Ln where n is the maximum length of the resultant string.", format)); 
     } 

     //get the length from the format string. 
     int length = int.MaxValue; 
     int.TryParse(format.Substring(1, format.Length - 1), out length); 

     //returned the argument with length applied. 
     return argument.ToString().Substring(0, length); 
    } 
} 

प्रयोग

var result = String.Format(
    new StringFormatEx(), 
    "{0:L4} {1:L7}", 
    "Stack", 
    "Overflow"); 

Assert.AreEqual("Stac Overflo", result); 
0

है यह कैसे String.Format का उपयोग करने पर एक जवाब है, लेकिन एक स्ट्रिंग विस्तार तरीकों का उपयोग कर छोटा करने का एक और तरीका नहीं है। इस तरह से आप string.format के बिना भी स्ट्रिंग में अधिकतम लंबाई जोड़ सकते हैं।

public static class ExtensionMethods 
{ 
    /// <summary> 
    /// Shortens string to Max length 
    /// </summary> 
    /// <param name="input">String to shortent</param> 
    /// <returns>shortened string</returns> 
    public static string MaxLength(this string input, int length) 
    { 
     if (input == null) return null; 
     return input.Substring(0, Math.Min(length, input.Length)); 
    } 
} 

नमूना उपयोग:

string Test = "1234567890"; 
string.Format("Shortened String = {0}", Test.MaxLength(5)); 
string.Format("Shortened String = {0}", Test.MaxLength(50)); 

Output: 
Shortened String = 12345 
Shortened String = 1234567890 
संबंधित मुद्दे