C#writeline cap

时间:2017-06-06 08:01:43

标签: c#

我正在编写一个程序,该程序写入需要特定位置的文件:

它看起来像:

writer.WriteLine("{0,-3}{1,-5}{2,-30}", data1, data2, data3);

它启动的位置是正确的,但是,如果data1超过3个字符,则按超出的数量推送格式,

有没有办法让data1上限为3个字符并使用writeline格式忽略任何多余的字符?

3 个答案:

答案 0 :(得分:3)

如果我理解正确,你应该“安全地子串”(Substring如果你选择一个大于字符串长度的长度则抛出一个异常)你的字符串到所需的长度。

public static string SafeSubstring(this string text, int start, int length)
{
    return text.Length <= start ? string.Empty
        : text.Length - start <= length ? text.Substring(start)
        : text.Substring(start, length);
}

然后,例如:

writer.WriteLine("{0,-3}{1,-5}{2,-30}", 
    data1.SafeSubstring(0, 3), 
    data2.SafeSubstring(0, 3), 
    data3.SafeSubstring(0, 3)); 

答案 1 :(得分:0)

使用string.Substring。如果字符串超过3个字符,则此代码将对其进行修剪:

Console.WriteLine("{0,-3}{1,-5}{2,-30}",
                  data1.Substring(0,data1.Length > 3 ? 3 : data1.Length), 
                  data2, data3);

答案 2 :(得分:0)

您无法单独使用格式化解决此问题,但您可以实施(扩展)方法:

   public static string ToLength(this object value, int length) {
     if (length == 0)
       return "";
     else if (null == value)
       return new string(' ', Math.Abs(length));

     string v = value.ToString();

     if (v.Length >= Math.Abs(length))
       return v.Substring(0, Math.Abs(length));
     else if (length < 0)
       return v.PadRight(-length);  
     else
       return v.PadLeft(length);   
   }

然后使用它

   writer.WriteLine("{0}{1}{2}", 
     data1.ToLength(-3), 
     data2.ToLength(-5), 
     data3.ToLength(-30));

我已经为object实现了扩展方法,而不是string,因为您可能希望将任何对象放到流中。