.NET Formatea una cadena con espacios fijos

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.

 "Cadena va aquí"
 "Cadena va aquí"
 "Cadena va aquí"

¿Cómo se hace esto usando .NET?

Editar – He intentado con Format / PadLeft / PadRight hasta 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 excelentes y correctas respuestas.

Esto le dará exactamente las cadenas que 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); 

La primera y la última, al menos, son posibles usando la siguiente syntax:

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

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

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

Le han mostrado PadLeft y PadRight . Esto completará el PadCenter faltante.

 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 para mí: no olvides actualizar tu CV: "¡Un día, incluso arreglé el código de Joel Coehoorn!" ;-D -Serge

prueba esto:

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

para el centro, obtenga la longitud de la cuerda y haga 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,' '); 

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 formateada.
  2. Cuando la longitud de s es mayor o igual a deisredLength , la función devuelve la cadena original.
  3. Cuando la longitud de s es menor que la Longitud deseada , se rellenará en ambos extremos.
  4. Debido a que el espaciado entre caracteres es entero y no hay medio espacio, podemos tener una división desigual del espacio. 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 primero y luego el botón Largo deseado .

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 firstpad variable entera . en el lado izquierdo (primera almohadilla) se aplica el (número correcto de) espacios blancos iniciales. El derecho PadRight (desiredLength) tiene un enlace inferior termina mediante la aplicación de espacios en blanco al final.

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

   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  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 cadena, dentro de un Módulo público (la forma en que usted hace 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).

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

Ver: modo AC # para ancho indirecto y formato de estilo.

Básicamente es un método, FormatEx, que actúa como String.Format, excepto que permite un modificador de alineación centrado.

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

Significa centrar el valor de varArgs [0] en un campo de 10 caracteres de ancho, inclinarse hacia la derecha si se requiere un espacio adicional de relleno.

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

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

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 usted desea.

-Jesse

parece que quieres algo como esto, que te colocará 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), "-") 

tenga en cuenta que esto tendrá problemas si mystring.length + leftbuffer excede el totallength

 ///  /// Returns a string With count chars Left or Right value ///  ///  ///  ///  ///  ///  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; }