如何在C#中将字符串截断或填充到固定长度

20

有没有一种一行代码的方法可以将一个字符串(在C#中)设置为固定长度,无论是通过截断还是填充空格(' ')。

例如:

string s1 = "abcdef";
string s2 = "abc";

将两者都设置为长度5后,我们应该有:

"abcde"
"abc  "

1
https://msdn.microsoft.com/zh-cn/library/system.string.format.aspx - Ingenioushax
6个回答

40
你只需要使用PadRightSubstring函数即可实现(前提是source不为空):
string source = ...
int length = 5;

string result = source.PadRight(length).Substring(0, length);

如果 source 可能为 null

string result = source == null 
  ? new string(' ', length) 
  : source.PadRight(length).Substring(0, length);

1
在 .NET 6 的环境下,对于空格,是否需要使用 .Substring(0, length) - rhavelka
2
@rhavelka:“PadRight(length)”保证我们至少有“length”长度,然后“Substring(0,length)”保证我们最多有“length”长度;目前为止我们恰好有“length”长度。 - Dmitry Bychenko

5
private string fixedLength(string input, int length){
    if(input.Length > length)
        return input.Substring(0,length);
    else
        return input.PadRight(length, ' ');
}

我本来希望能够用一行代码解决问题,但是我已经怀疑不得不采取这种方法了。 - Graham
s1.Length > 5 ? s1.Substring(0,5) : s1.PadRight(5) 需要执行。 - Graham
@Graham刚想建议您使用三元运算符,但我认为这会使代码更丑。 - waka
2
@Graham:将其作为扩展方法会更适合这种情况。 - huMpty duMpty

2
我会使用 @waka 的答案,但作为扩展方法和空值验证,如下所示:
    public static string FixedLength(this string value, int totalWidth, char paddingChar)
    {
        if (value is null)
            return new string(paddingChar, totalWidth);

        if (value.Length > totalWidth)
            return value.Substring(0, totalWidth);
        else
            return value.PadRight(totalWidth, paddingChar);
    }

1
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - user8866053

2

一个自定义的一行代码可以是str.Length > 5 ? str.Substring(0,5) : str.PadRight(5);


1
你测试过需要截断的更长字符串的自定义一行代码吗?另外,PadRight应该给出所需的总长度,而不是要添加的空格数。 - ToolmakerSteve
@ToolmakerSteve 这个一行代码测试了 str.Length 并使用 Substring() 截断它;同时 PadRight 中的数字 5 就是所需的长度。这正是问题中要求的。我有什么误解吗? - Reinstate Monica
我看到你在我的评论后编辑了答案。现在这个一行代码看起来是正确的。不幸的是,格式字符串明显有误——没有闭合括号。更重要的是,如果我没记错的话,那个字符串格式化不会截断较长的字符串,请测试一下。(肯定是其他人给你点了踩)要么找到一种方法修复字符串格式,使其能够截断,要么删除答案中的那部分。 - ToolmakerSteve
看起来你想要的格式字符串是"{0,-5}"。这将填充一个较短的字符串,使其达到5个字符,但不会截断一个较长的字符串。在String.Format文档中:"如果对齐值小于要插入的参数的长度,则忽略对齐..."我没有在文档中看到任何能够截断字符串的格式规范。(像你所做的那样,在“:”之后的数字是无效的,据我所知。那里应该有一个表示格式代码的字母。) - ToolmakerSteve
1
@ToolmakerSteve 哎呀!我以为你的评论是新的(答案出现在我的收件箱中),我没有检查日期,对此感到抱歉。我无法弄清楚我当时关于Format()调用在想什么 - 我会删除它。 - Reinstate Monica

1

这将始终生成一个不超过最大宽度的字符串

public static string MaxLength(this string value, int maxWidth)
{
  return (value == null) ?
  String.Empty :
  value.PadRight(maxWidth).Substring(0, maxWidth).TrimEnd();
}

1

你试过使用s1.PadLeft(5)吗?

如果你想填充其他字符,你也可以指定填充字符。

s1.PadLeft(6, '.');

会给你:"abcdef."

要做两件事:

var s1 = "1234567890";
var s2 = s1.SubString(5).PadLeft(5);

2
抱歉,但 s1.SubString(5).PadLeft(5);67890;如果 s1 = "123" 则会出现 exception - Dmitry Bychenko

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