87 votos

.NET Formato de una cadena de caracteres con espacios fijos

Hace el .RED de Cadena.Formato método de permitir la colocación de una cadena en una posición fija dentro de una cadena de longitud fija.

"Cadena Va Aquí"
"Cadena Va Aquí "
"Cadena Va Aquí "

Cómo se hace esto usando .NETA?

Editar - he tratado de Formato/PadLeft/PadRight a la muerte. Ellos no trabajan. No sé por qué. Terminé de escribir mi propia función para hacer esto.

Editar - he cometido un error y se utiliza una coma en lugar de una coma en el especificador de formato. Debe ser "{0,20}".

Gracias a todos por la excelente y las respuestas correctas.

223voto

Guffa Puntos 308133

Esto le dará exactamente las cadenas que usted solicitó:

string s = "String goes here";
string line1 = String.Format("{0,27}", s);
string line2 = String.Format("{0,-27}", String.Format("{0," + ((27 + s.Length) / 2).ToString() +  "}", s));
string line3 = String.Format("{0,-27}", s);

29voto

Konrad Rudolph Puntos 231505

El primero y el último, al menos, son posibles mediante la siguiente sintaxis:

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");

9voto

Joel Coehoorn Puntos 190579

Ha sido mostrado PadLeft y PadRight. Esto llenará la falta PadCenter.

public static class StringUtils
{
    public static string PadCenter(this string s, int width, char c)
    {
        if (s == null || width <= s.Length) return s;

        int padding = width - s.Length;
        return s.PadLeft(s.Length + padding / 2, c).PadRight(width, c);
    }
}

Nota: no te olvides de actualización del CURRÍCULUM: "Un día, incluso me fijo Joel Coehoorn del código!" ;-D-Serge

5voto

chi Puntos 31

Gracias por el debate, este método también funciona (VB):

Public Function StringCentering(ByVal s As String, ByVal desiredLength As Integer) As String
    If s.Length >= desiredLength Then Return s
    Dim firstpad As Integer = (s.Length + desiredLength) / 2
    Return s.PadLeft(firstpad).PadRight(desiredLength)
End Function
  1. StringCentering() toma dos valores de entrada y devuelve un formato de la cadena.
  2. Cuando la longitud de s es mayor que o igual a deisredLength, la función devuelve la cadena original.
  3. Cuando la longitud de s es menor que desiredLength, será collar de ambos extremos.
  4. Debido a que el espaciado entre caracteres es un número entero y no hay espacio medio, podemos tener una desigual división del espacio. En esta implementación, la mayor división va a la cabeza.
  5. La función requiere .NET Framework debido a PadLeft() y PadRight().
  6. En la última línea de la función, la unión es de izquierda a derecha, de manera firstpad se aplica seguido por el desiredLength pad.

Aquí está la versión de C#:

public string StringCentering(string s, int desiredLength)
{
    if (s.Length >= desiredLength) return s;
    int firstpad = (s.Length + desiredLength) / 2;
    return s.PadLeft(firstpad).PadRight(desiredLength);
}

Para ayudar a la comprensión, variable de tipo entero firstpad se utiliza. s.PadLeft(firstpad) se aplica el (número de) los espacios en blanco iniciales. Más a la derecha PadRight(desiredLength) tiene una menor unión remata mediante la aplicación de trailing espacios en blanco.

1voto

Lumirris Puntos 635

He aquí una VB.NET la versión que he creado, inspirado por Joel Coehoorn la respuesta de Oliver, editar, y shaunmartin comentario:

    <Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer, ByVal c As Char) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2), c).PadRight(width, c)

End Function

<Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2)).PadRight(width)

End Function

Este se configura como una cadena de extensión, dentro de un Módulo Público (la forma de hacer Extensiones en VB.NET, un poco diferente de C#). Mi pequeño cambio es que se trata de una cadena nula como una cadena vacía, y rellena una cadena vacía con el valor de la anchura (cumple con mis necesidades particulares). Esperemos que esto se convierta fácilmente en C# para cualquier persona que la necesite. Si hay una mejor forma de hacer referencia a las respuestas, ediciones y comentarios que he mencionado anteriormente, que inspiró mi post, por favor hágamelo saber y voy a hacerlo - soy relativamente nuevo para la publicación, y yo no podía entender por dejar un comentario (que puede no tener suficiente rep todavía).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X