我想截断一个字符串,使其长度不超过给定值。我正在向数据库表写入数据,并希望确保写入的值满足列数据类型的约束。
例如,如果我能写以下内容,那就太好了:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
不幸的是,这会引发异常,因为maxLength通常超过字符串值的边界。当然,我可以写一个像下面这样的函数,但我希望这样的东西已经存在了。
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
执行此任务的难以捉摸的API在哪里?有吗?
出于(过度)复杂性的考虑,我将添加重载版本,它将maxLength参数的最后3个字符替换为省略号。
public static string Truncate(this string value, int maxLength, bool replaceTruncatedCharWithEllipsis = false)
{
if (replaceTruncatedCharWithEllipsis && maxLength <= 3)
throw new ArgumentOutOfRangeException("maxLength",
"maxLength should be greater than three when replacing with an ellipsis.");
if (String.IsNullOrWhiteSpace(value))
return String.Empty;
if (replaceTruncatedCharWithEllipsis &&
value.Length > maxLength)
{
return value.Substring(0, maxLength - 3) + "...";
}
return value.Substring(0, Math.Min(value.Length, maxLength));
}
您可以创建一个Truncate扩展方法,它将最大长度与字符串长度进行比较,并在需要时调用Substring。
如果您想要与Substring类似的空处理行为,则不要包含空检查。这样,就像str. substring(0,10)在str为空时抛出NullReferenceException一样,str. truncate(10)也会抛出NullReferenceException。
public static class StringExtensions
{
public static string Truncate(this string value, int maxLength) =>
value.Length <= maxLength ? value : value.Substring(0, maxLength);
}