【问题标题】:c# fixed length stringc# 固定长度字符串
【发布时间】:2013-10-09 22:57:11
【问题描述】:

我需要生成一个固定长度的文本行:

我现在拥有的是:

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 方法:msdn.microsoft.com/en-us/library/92h5dc07.aspx 获得所需宽度的字符串。
  • 如果传入一个空格会发生什么? _sb.Append(string.Format("{0,30}", " "));
  • 您的代码仍然会生成一个 55 个字符长的字符串,其中最后 30 个是空格字符。

标签: c# string fixed-length-record


【解决方案1】:

你可以使用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)

【讨论】:

  • 当它清空字符串时,pad左侧不起作用
  • 对不起,我不应该把 String.Format 放在那里。检查我的编辑。
  • 不确定发生了什么,我的编辑没有通过。现在好多了。
【解决方案2】:

你确定吗?尝试添加分隔符,只是为了查看子字符串在哪里结束

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|                              |<

【讨论】:

  • 你应该使用 _sb.AppendFormat()
【解决方案3】:

默认情况下会添加空字符,直到匹配所需的长度。

示例: "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()));
    }
}

【讨论】:

【解决方案4】:

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

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

【讨论】:

    【解决方案5】:
    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)           = "     "
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多