Me gustaría truncar una cadena de modo que su longitud no sea más larga que un valor dado. 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 algo como esto ya exista.
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?
StringBuilder
permite truncar acortando la longitud, pero aún necesita realizar la verificación de longitud para evitar ensanchar la cadena..Trim()
de una manera que hace que parezca engañoso que muta la cadena: "Elimina todos los caracteres de espacio en blanco iniciales y finales del objeto de cadena actual ".Respuestas:
No hay un
Truncate()
método en cadena, desafortunadamente. Tienes que escribir este tipo de lógica tú mismo. Sin embargo, lo que puede hacer es envolver esto en un método de extensión para que no tenga que duplicarlo en todas partes:Ahora podemos escribir:
fuente
maxLength
sea un valor negativo.O en lugar del operador ternario, podría usar Math.min
fuente
value.Substring(0, value.Length)
.maxLength
sea un valor negativo.maxLength
a0
ovalue.Length
; o necesito lanzar unArgumentOutOfRangeException
... que tiene más sentido en este caso, y deSubstring
todos modos ya lo arrojó .return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
Pensé que lanzaría mi implementación ya que creo que cubre todos los casos que han sido abordados por los demás y lo hace de una manera concisa que aún es legible.
Esta solución se basa principalmente en la solución de Ray y abre el método para usarlo como un método de extensión mediante el uso de esta palabra clave tal como lo hace LBushkin en su solución.
fuente
maxLength
sea un valor negativo.Porque las pruebas de rendimiento son divertidas: (usando métodos de extensión de linqpad )
El
truncate
método fue "significativamente" más rápido. #microoptimizationTemprano
Tarde
Demasiado largo
fuente
En .NET 4.0 puede usar el
Take
método:No probado para la eficiencia!
fuente
Podrías usar LINQ ... elimina la necesidad de verificar la longitud de la cadena. Es cierto que quizás no sea el más eficiente, pero es divertido.
o
fuente
Hice el mío en una línea como esta
fuente
Parece que nadie ha publicado esto todavía:
El uso del operador && lo hace marginalmente mejor que la respuesta aceptada.
fuente
.NET Framework tiene una API para truncar una cadena como esta:
Pero en una aplicación C #, probablemente preferirás usar la tuya propia que depender de Microsoft.VisualBasic.dll, cuya razón de ser principal es la compatibilidad con versiones anteriores.
fuente
Microsoft.VisualBasic.Strings
módulos en .NET Core están bastante vacíos .Otra solución:
fuente
Sé que esta es una vieja pregunta, pero aquí hay una buena solución:
Devoluciones: hola ...
fuente
Una variante similar con el operador de propagación nula de C # 6
Tenga en cuenta que esencialmente estamos verificando si
value
es nulo dos veces aquí.fuente
Todavía no hay método Truncar en 2016 para cadenas de C #. Pero - Usando C # 6.0 Sintaxis:
Funciona a las mil maravillas:
fuente
Tomando @CaffGeek y simplificándolo:
fuente
Tenga en cuenta que truncar una cadena no solo significa simplemente cortar una cadena en una longitud específica solo, sino que debe tener cuidado de no dividir la palabra.
por ejemplo, cadena: esta es una cadena de prueba.
Quiero cortarlo a las 11. Si utilizamos alguno de los métodos dados anteriormente, el resultado será
esto es un te
Esto no es lo que queremos
El método que estoy usando también puede no ser tan perfecto, pero puede manejar la mayoría de las situaciones.
fuente
Por qué no:
es decir, en el evento
value.Length < maxLength
, los espacios del pad hasta el final o truncar el exceso.fuente
Por si acaso no hay suficientes respuestas aquí, aquí está la mía :)
usar:
fuente
En aras de la (sobre) complejidad, agregaré mi versión sobrecargada que reemplaza los últimos 3 caracteres con puntos suspensivos con respecto al parámetro maxLength.
fuente
Mis dos centavos con una longitud de ejemplo de 30:
fuente
Prefiero la respuesta de jpierson, pero ninguno de los ejemplos que puedo ver aquí está manejando un parámetro maxLength no válido, como cuando maxLength <0.
Las opciones serían manejar el error en un intento / captura, sujetar el parámetro maxLength min a 0 o si maxLength es menor que 0 devolver una cadena vacía.
Código no optimizado:
fuente
Aquí hay una solución de vb.net, marque que la instrucción if (aunque fea) mejora el rendimiento porque no necesitamos la instrucción de subcadena cuando la cadena ya es más pequeña que la longitud máxima ... Al hacerla una extensión de cadena, es fácil de usar. ..
fuente
Sé que ya hay un montón de respuestas, pero mi necesidad era mantener intactos el principio y el final de la cadena, pero acortarla por debajo de la longitud máxima.
Esto es para crear URL de SharePoint que tengan una longitud máxima de 260 caracteres.
No hice de la longitud un parámetro ya que es una constante 260. Tampoco hice de la primera longitud de subcadena un parámetro porque quiero que se rompa en un punto específico. Finalmente, la segunda subcadena es la longitud de la fuente: 20, ya que conozco la estructura de la carpeta.
Esto podría adaptarse fácilmente a sus necesidades específicas.
fuente
Sé que ya hay un montón de respuestas aquí, pero esta es con la que he ido, que maneja tanto las cadenas nulas como la situación en la que la longitud pasada es negativa:
fuente
En C # 8, se puede usar la nueva función Rangos ...
fuente
No hay nada en .net para esto que yo sepa, aquí está mi versión que agrega "...":
fuente
TruncateString
fuente
Como una adición a las posibilidades discutidas anteriormente, me gustaría compartir mi solución. Es un método de extensión que permite nulo (devuelve string.Empty) también hay un segundo .Truncate () para usarlo con puntos suspensivos. Cuidado, no es un rendimiento optimizado.
fuente
fuente
ToArray()
llamada aquí es simplemente innecesaria sobrecarga; usando, por ejemploString.Concat
, puede construir una cadena a partir de un número de caracteres enumerables sin tener que pasar por una matriz.Truncar cadena
fuente
Este es el código que suelo usar:
fuente