2009-03-13 8 views
140

El método .NET String.Format permite la colocación de una cadena en una posición fija dentro de una cadena de longitud fija..NET Formatee una cadena con espacios fijos

 
"   String Goes Here" 
"  String Goes Here  " 
"String Goes Here   " 

¿Cómo se hace esto con .NET?

Editar - He intentado Format/PadLeft/PadRight a la muerte. No funcionan. No sé por qué. Terminé escribiendo mi propia función para hacer esto.

Editar - Cometí un error y usé dos puntos en vez de una coma en el especificador de formato. Debería ser "{0,20}".

Gracias por todas las respuestas excelentes y correctas.

+37

nunca he tenido una pregunta Cadenas de formato que no podía responder por ir a esta página: http://blog.stevex.net/index.php/string-formatting-in-csharp/ – jcollum

+0

@jcollum: Me encantaría votar su respuesta pero no puedo hacer nada por los comentarios – Dinah

+0

PadLeft funciona para mí, compruebe que está dejando el espacio en PadLeft (20, 'AQUÍ VA UN ESPACIO') –

Respuesta

49

La primera y la última, al menos, son posibles utilizando la siguiente sintaxis:

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

He intentado su sugerencia. No funciona. – user72491

+0

Inténtalo de nuevo; Mi código contenía un error tipográfico al principio. Usé ':' en lugar de ',' pero lo he corregido ahora. –

8

intente esto:

"String goes here".PadLeft(20,' '); 
"String goes here".PadRight(20,' '); 

para el centro de obtener la longitud de la cuerda y hacer PadLeft y padright con los caracteres necesarios

int len = "String goes here".Length; 
int whites = len /2; 
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' '); 
+0

Parece que las llamadas String.Format() son superfluas. –

+0

Sí, no sé por qué lo dejé, ahora estoy editando. –

-1

Parece que quieres algo como esto, que w mal lugar en el que la cadena en un punto fijo en una cadena de longitud constante:

Dim totallength As Integer = 100 
Dim leftbuffer as Integer = 5 
Dim mystring As String = "string goes here" 
Dim Formatted_String as String = mystring.PadLeft(leftbuffer + mystring.Length, "-") + String.Empty.PadRight(totallength - (mystring.Length + leftbuffer), "-") 

nota que esto tendrá problemas si mystring.length + leftbuffer excede totallength

14

Usted ha demostrado PadLeft y PadRight. Esto completará el PadCenter que falta.

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 a la libre: no se olvide de actualizar propio CV: "Un día, incluso de código fijo de Joel Coehoorn" ;-D -Serge

+0

Joel, buen fragmento: estoy tratando de usarlo y no está del todo centrado, como está. Parece que la línea de retorno debe ser algo así como (No tengo suficiente representante para editar ...): return s.PadLeft ((relleno/2) + s.Length, c) .PadRight (ancho, c) ; – shaunmartin

356

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

string s = "String goes here"; 
string lineAlignedRight = String.Format("{0,27}", s); 
string lineAlignedCenter = String.Format("{0,-27}", 
    String.Format("{0," + ((27 + s.Length)/2).ToString() + "}", s)); 
string lineAlignedLeft = String.Format("{0,-27}", s); 
+49

Esto debe marcarse como la respuesta correcta a la pregunta, pero parece que el OP ha dejado el stackoverflow. – Oliver

+7

Si busca la verificación verde frente a la más alta de votos, no sabe cómo SO;) –

+2

@DaveJellison Parece que alguien tiene que escribir un complemento para arreglar eso, o SO debería simplemente convertirlo en un usuario configurable preferencia. –

1

Aquí hay una versión VB.NET creé, inspirado por la respuesta de Joel Coehoorn, edición de Oliver, y el comentario de shaunmartin:

<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 

Esto se configura como una extensión de la cadena, en el interior 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 trata una cadena vacía como una cadena vacía, y rellena una cadena vacía con el valor de ancho (cumple con mis necesidades particulares). Esperemos que esto se convierta fácilmente en C# para cualquiera que lo necesite. Si hay una mejor manera de hacer referencia a las respuestas, ediciones y comentarios que mencioné anteriormente, que inspiraron mi publicación, háganmelo saber y lo haré. Soy relativamente nuevo en la publicación y no pude entenderlo. deja un comentario (puede que aún no tenga suficientes representantes).

0

Publiqué un artículo de CodeProject que puede ser lo que quieres.

Ver: A C# way for indirect width and style formatting.

Básicamente se trata de un método, Formatex, que actúa como String.Format, excepto que permite un modificador de la alineación centrada.

FormatEx("{0,c10}", value); 

Medios centrar el valor de varargs [0] en un amplio campo de 10 caracteres, inclínese hacia la derecha si se requiere un espacio de relleno adicional.

FormatEx("{0,c-10}", value); 

Medios centrar el valor de varargs [0] en un amplio campo de 10 caracteres, inclinarse hacia la izquierda si se requiere un espacio de relleno adicional.

Editar: Internamente, es una combinación de Joel's PadCenter con algunos análisis para reestructurar el formato y varArgs para una llamada a String.Format que hace lo que quiere.

-Jesse

6

Gracias por la discusión, 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 una cadena con formato .
  2. Cuando la longitud de s es igual o mayor que deisredLength, la función devuelve la cadena original.
  3. Cuando la longitud de s es menor que deseadaLongitud, se rellenará en ambos extremos.
  4. Debido a que el espaciado de caracteres es entero y no hay medio espacio, podemos tener una división de espacio desigual. En esta implementación, la mayor división va al extremo inicial.
  5. La función requiere .NET Framework debido a PadLeft() y PadRight().
  6. En la última línea de la función, el enlace es de izquierda a derecha, por lo que se aplica firstpad seguido del deseadoLongitud pad.

Aquí está la versión 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, se utiliza la variable entera firstpad. en el lado izquierdo (primera almohadilla) aplica el (número correcto de) espacios en blanco iniciales. El lado derecho PadRight (longitud deseada) tiene una unión inferior que termina aplicando espacios blancos posteriores.

+0

Bienvenido a SO, chi. Este es otro ejemplo de una GRAN primera publicación y respuesta. +1 – Brian

+0

Gracias Brian, la pregunta original en la parte superior de esta publicación es un excelente punto de partida. Me inspiran todas las publicaciones y respuestas anteriores a la mía. – chi

-6
/// <summary> 
/// Returns a string With count chars Left or Right value 
/// </summary> 
/// <param name="val"></param> 
/// <param name="count"></param> 
/// <param name="space"></param> 
/// <param name="right"></param> 
/// <returns></returns> 
public static string Formating(object val, int count, char space = ' ', bool right = false) 
{ 
    var value = val.ToString(); 
    for (int i = 0; i < count - value.Length; i++) value = right ? value + space : space + value; 
    return value; 
} 
+3

No use este código: genera muchas asignaciones de cadenas innecesarias. Use en su lugar los especificadores de formato y los métodos de relleno integrados. –

+1

holy .. imagine usar esto dentro de un bucle :) – LuckyLikey

13

A partir de Visual Studio 2015 también se puede hacer esto con Interpolated Strings (es un truco compilador, por lo que no importa qué versión de .NET Framework a apuntar).

string value = "String goes here"; 
string txt1 = $"{value,20}"; 
string txt2 = $"{value,-20}"; 
+1

es una característica C# 6. – LuckyLikey

Cuestiones relacionadas