我想截断一个字符串,使其长度不超过给定值。我正在向数据库表写入数据,并希望确保写入的值满足列数据类型的约束。
例如,如果我能写以下内容,那就太好了:
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在哪里?有吗?
TruncateString
public static string _TruncateString(string input, int charaterlimit)
{
int characterLimit = charaterlimit;
string output = input;
// Check if the string is longer than the allowed amount
// otherwise do nothing
if (output.Length > characterLimit && characterLimit > 0)
{
// cut the string down to the maximum number of characters
output = output.Substring(0, characterLimit);
// Check if the character right after the truncate point was a space
// if not, we are in the middle of a word and need to remove the rest of it
if (input.Substring(output.Length, 1) != " ")
{
int LastSpace = output.LastIndexOf(" ");
// if we found a space then, cut back to that space
if (LastSpace != -1)
{
output = output.Substring(0, LastSpace);
}
}
// Finally, add the "..."
output += "...";
}
return output;
}
请注意,截断字符串不仅仅意味着仅以指定的长度切割字符串,而且必须注意不要分割单词。
Eg字符串:这是一个测试字符串。
我想把它剪到11点。如果我们使用上面给出的任何一种方法,结果将是
这是一个
这不是我们想要的
我使用的方法可能也不是那么完美,但它可以处理大多数情况
public string CutString(string source, int length)
{
if (source== null || source.Length < length)
{
return source;
}
int nextSpace = source.LastIndexOf(" ", length);
return string.Format("{0}...", input.Substring(0, (nextSpace > 0) ? nextSpace : length).Trim());
}
作为上述可能性的补充,我想分享一下我的解决方案。
它是一个扩展方法,允许null(返回string.Empty),还有第二个. truncate()用于与省略号一起使用。注意,它不是性能优化的。
public static string Truncate(this string value, int maxLength) =>
(value ?? string.Empty).Substring(0, (value?.Length ?? 0) <= (maxLength < 0 ? 0 : maxLength) ? (value?.Length ?? 0) : (maxLength < 0 ? 0 : maxLength));
public static string Truncate(this string value, int maxLength, string ellipsis) =>
string.Concat(value.Truncate(maxLength - (((value?.Length ?? 0) > maxLength ? ellipsis : null)?.Length ?? 0)), ((value?.Length ?? 0) > maxLength ? ellipsis : null)).Truncate(maxLength);
基于这个和这个,这里有两个版本,将适用于“到”值的负值。第一个函数不允许负数无声地设置为0:
public static string Truncate(this string value, int maxLength)
{
return string.IsNullOrEmpty(value) ?
value :
value.Substring(0, Math.Max(0, Math.Min(value.Length, maxLength)));
}
这是一个循环:
private static int Mod(this int a, int n) => (((a %= n) < 0) ? n : 0) + a;
public static string Truncate(this string value, int maxLength)
{
return string.IsNullOrEmpty(value) ?
value :
value.Substring(0, maxLength.Mod(value.Length));
}