C# 固定长度字符串

10
我需要生成一个固定长度的文本行:
目前我拥有的是:
StringBuilder _sb = new StringBuilder();

_sb.Append(string.Format("{0,5}", "MM")); // serie to cancel
_sb.Append(string.Format("{0,20}", "45444")); // folio to cancel
_sb.Append(string.Format("{0,30}", "AC1122")); // account number (optional)

这很好用,因为它生成一个长度为55个字符的固定字符串。

问题出现在例如可选值为空字符串的情况下:

StringBuilder _sb = new StringBuilder();

_sb.Append(string.Format("{0,5}", "MM")); // serie to cancel
_sb.Append(string.Format("{0,20}", "45444")); // folio to cancel
_sb.Append(string.Format("{0,30}", "")); // account number (optional)

如果在string.format中留空字符串,将无法给出固定长度,我仍然需要有30个字符的长度。

非常感谢您提供的任何线索!

谢谢


使用String.PadLeft方法:http://msdn.microsoft.com/en-us/library/92h5dc07.aspx,以获得所需宽度的字符串。 - aybe
如果传入一个空格会发生什么?_sb.Append(string.Format("{0,30}", " ")); - Jason
你的代码仍然生成一个55个字符长的字符串,其中最后30个是空格字符。 - Preston Guillot
5个回答

12

您可以使用 PadLeft 方法:

StringBuilder _sb = new StringBuilder();

_sb.Append("MM".PadLeft(5)); // serie to cancel
_sb.Append("45444".PadLeft(20)); // folio to cancel
_sb.Append("".PadLeft(30)); // account number (optional)

当字符串为空时,左侧填充不起作用。 - VAAA
抱歉,我不应该在那里放置String.Format。请检查我的编辑。 - Szymon
不确定发生了什么事,我的编辑没有成功。现在好了。 - Szymon

3

你确定吗?试着添加一个分隔符,以便看到子字符串的结束位置。

StringBuilder _sb = new StringBuilder();
_sb.Append(string.Format("{0,5}|", "MM")); // serie to cancel
_sb.Append(string.Format("{0,20}|", "45444")); // folio to cancel
_sb.Append(string.Format("{0,30}|", "")); // account number (optional
Console.WriteLine(">" + _sb.ToString() + "<");

>   MM|               45444|                              |<

3
你应该使用 _sb.AppendFormat()。 - DrKoch

1
默认情况下,它会添加空字符,直到达到所需的长度为止。
例如:"Hello".ToFixedString(10) 将生成 "Hello "
public static class StringExtensions
{
    /// <summary>
    /// Extends the <code>String</code> class with this <code>ToFixedString</code> method.
    /// </summary>
    /// <param name="value"></param>
    /// <param name="length">The prefered fixed string size</param>
    /// <param name="appendChar">The <code>char</code> to append</param>
    /// <returns></returns>
    public static String ToFixedString(this String value, int length, char appendChar = ' ')
    {
        int currlen = value.Length;
        int needed = length == currlen ? 0 : (length - currlen);

        return needed == 0 ? value :
            (needed > 0 ? value + new string(' ', needed) :
                new string(new string(value.ToCharArray().Reverse().ToArray()).
                    Substring(needed * -1, value.Length - (needed * -1)).ToCharArray().Reverse().ToArray()));
    }
}

如果(值==null),则返回null;虽然还有更简单的版本可用。 - Chef Gladiator

1
public static String FixedStr(this string s, int length, char padChar = ' ')
        => String.IsNullOrEmpty(s) ? new string(padChar, length) : s.Length > length ? s.Remove(length) : s.Length < length ? s.PadRight(length) : s;

例子:

"1234567890".FixedStr(5) = "12345"
"12345".FixedStr(5)      = "12345"
"12".FixedStr(5)         = "12   "
"".FixedStr(5)           = "     "

0

不确定什么是最好的方法,但以下方法应该有效:

string appended = string.Format("{0,5}", "MM");
appended += string.Format("{0,20}", "45444");
appended += string.Format("{0,30}", "");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接