2010-11-05 49 views
12

没有找到如何做到这一点。我发现的或多或少都是这样的(http://blog.stevex.net/string-formatting-in-csharp/):可以在C#格式字符串中定义最大数量的字符吗?

字符串内部确实没有任何格式化,超出了它的对齐。对齐适用于在String.Format调用中打印的任何参数。 样本生成

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

究竟是什么你想实现什么?你能发表你想看到什么样的例子吗? – Oded 2010-11-05 11:24:12

+0

我想将C格式的字符串转换为C#格式的字符串。在C中,你可以指定%-4.4s和类似的。 – 2010-11-05 11:37:44

+0

为什么投票?这是必不可少的问题! – 2010-11-05 12:04:26

回答

7

你想要的是不是“原生地”通过C#字符串格式化的支持,作为字符串对象的String.ToString方法只是返回字符串本身。

当你调用

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

如果someobject实现了IFormattable接口,超载ToString(string format,IFormatProvider formatProvider)方法被调用,以 “XXX” 为format参数。

因此,这并不是.NET字符串格式设计中的缺陷,而只是缺少字符串类中的功能。

如果您真的需要这个,您可以使用任何建议的解决方法,或创建自己的实现IFormattable接口的类。

+0

谢谢!你绝对是对的。这是缺少某些东西的字符串类。但是你是否使用过xxx作为某种格式的例子,或者它是否真的意味着什么(例如3个字符)? – 2010-11-05 13:03:11

+0

@matti,没有xxx只是一个例子。实际上,它的含义取决于IFormattable接口的实现。无论如何(作为一个C++爱好者来讲),C++中的字符串格式与c#*中的字符串格式相比较*,提到缺少这个特殊功能的缺陷似乎对我来说很陌生;) – 2010-11-05 16:03:58

0

你不能只使用参数而不是格式应用长度参数吗? (“ - > {0} < - ”,toFormat.PadRight(10)); // - >你好< -

或者写你自己的格式化程序,让你做到这一点?

+0

c对问题的评论 – 2010-11-05 11:43:16

0

为什么不直接使用Substr来限制字符串的长度?

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

c对问题的评论 – 2010-11-05 11:42:40

+0

我错过了这样一个事实,即即使Substr也有一些与其他语言不同的尴尬实现。我使用这种解决方法,因为它是和它失败,当字符串短于10个字符... – 2015-09-15 13:05:45

0

我写了一个自定义的格式化程序,它实现了用于设置最大宽度的“L”格式说明符。当我们需要控制格式化输出的大小,比如发往数据库列或Dynamics CRM字段时,这非常有用。

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 
相关问题