¿Cómo trunco una cadena .NET?
Me gustaría truncar una cadena de modo que su longitud no sea mayor que un valor determinado. Estoy escribiendo en una tabla de base de datos y quiero asegurarme de que los valores que escribo cumplan con la restricción del tipo de datos de la columna.
Por ejemplo, sería bueno si pudiera escribir lo siguiente:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
Desafortunadamente, esto genera una excepción porque maxLength
generalmente excede los límites de la cadena value
. Por supuesto, podría escribir una función como la siguiente, pero esperaba que ya existiera algo como esto.
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
¿Dónde está la esquiva API que realiza esta tarea? ¿Hay uno?
Desafortunadamente, no existe un Truncate()
método en cadena. Tienes que escribir este tipo de lógica tú mismo. Sin embargo, lo que puedes hacer es incluir esto en un método de extensión para no tener que duplicarlo en todas partes:
public static class StringExt
{
public static string Truncate(this string value, int maxLength)
{
if (string.IsNullOrEmpty(value)) return value;
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
}
Ahora podemos escribir:
var someString = "...";
someString = someString.Truncate(2);
2021-09-17 Alternativa con sufijo y tipos de referencia que aceptan valores NULL en C#8.
public static class StringExt
{
public static string? Truncate(this string? value, int maxLength, string truncationSuffix = "…")
{
return value?.Length > maxLength
? value.Substring(0, maxLength) + truncationSuffix
: value;
}
}
Escribir:
"abc".Truncate(2); // "ab…"
"abc".Truncate(3); // "abc"
((string)null).Truncate(3); // null
O en lugar del operador ternario, podrías usar Math.min
public static class StringExt
{
public static string Truncate( this string value, int maxLength )
{
if (string.IsNullOrEmpty(value)) { return value; }
return value.Substring(0, Math.Min(value.Length, maxLength));
}
}