separador miles interpolacion hora formato fecha ejemplos dar cambiar cadenas c# .net vb.net string string-formatting

c# - miles - String.Format: cómo funciona y cómo implementar cadenas de formatos personalizados



string format c# separador de miles (7)

  1. Consulte los documentos oficiales de MSDN, aquí hay una lista completa de cadenas de formato DateTime: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx . De hecho, hay bastantes cadenas "mágicas".

  2. Por lo que sé, no todos los tipos tienen un formato "interesante", pero todos los tipos admiten ToString() . Si necesita formatear un objeto incorporado, puede agregar un método de extensión para hacerlo, pero generalmente el formato se proporciona en cualquier lugar donde se necesita (o para decirlo de otra manera, solo he escrito formateadores personalizados para mis propios tipos) .

  3. Sí, puede escribir el suyo y si tiene datos que pueden formatearse de diferentes maneras, probablemente deba escribir un formateador personalizado implementando IFormattable, vea de nuevo los documentos aquí: IFormattable . Es bastante simple, simplemente revisa las cadenas proporcionadas y escribe sus datos en función de estos, no hay magia detrás de escena :-)

Con String.Format() es posible formatear, por ejemplo, objetos DateTime de muchas maneras diferentes. Cada vez que busco el formato deseado, necesito buscar en Internet. Casi siempre encuentro un ejemplo que puedo usar. Por ejemplo:

String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012"

Pero no tengo ni idea de cómo funciona y qué clases admiten estas cadenas adicionales ''mágicas''.

Entonces mis preguntas son:

  1. ¿Cómo String.Format la información adicional MM/dd/yyyy a un resultado de cadena?
  2. ¿Todos los objetos de Microsoft admiten esta característica?
    ¿Está esto documentado en alguna parte?
  3. ¿Es posible hacer algo como esto?
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

Debajo de las cubiertas String.Format hace algo de la siguiente manera,

IFormattable formattable = objectToFormat as IFormattable; if (formattable != null) { formattable.ToString(objectToFormat); } else { objectToFormat.ToString(); }

Para sus preguntas,

  1. ¿Cómo asigna String.Format la información adicional MM / dd / aaaa a un resultado de cadena?

    Como se especifica anteriormente, simplemente llama a IFormattable .ToString (formato de cadena, proveedor de proveedor de IFormat). El proveedor es a menudo algo que le dice cuál es la cultura de su sistema. A menudo nulo porque las personas no lo pasan String.Format () como lo hizo en su caso.

  2. ¿Todos los objetos de Microsoft admiten esta característica? ¿Está esto documentado en alguna parte?

    Todo lo que implementa IFormattable lo hace.

  3. ¿Es posible hacer algo como esto: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    Básicamente, si desea que su propio objeto haga algo con el formato proporcionado, implemente IFormattable .

Hay una gran cantidad de clases de apoyo y enumeradores para garantizar que las cadenas de formato sean en gran medida similares. Más aquí .


Desde mi entendimiento, necesitarías implementar IFormattable en tu clase para apoyar esto. Entonces tiene el método, ToString, que toma los parámetros que pasas a String.Format.

Aquí hay un ejemplo.

// Define other methods and classes here public class Sample : IFormattable { public string ToString(string format, IFormatProvider provider) { return String.Concat("Your custom format was ", format); } } String.Format("{0:MyCustomFormat}", new Sample())


La documentación de las fechas se puede encontrar aquí: this

Eso debería indicar exactamente qué significan todos los caracteres de formato de fecha como MM.

Si desea cambiar el resultado de una cadena para una clase personalizada, puede anular el método ToString, así:

public class User { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return this.Name + " is " + this.Age + " years old."; } }

y luego puede hacer algo como myUser.ToString() y obtener el resultado que ha especificado.


Sí, es posible, puede ser completamente personalizado. Mire this enlace de documentación en el formato personalizado de fecha y hora.

Si tiene su propio objeto, depende de usted anular el método ToString() y ToString() lo que crea que es la representación adecuada. Una vez hecho esto, puede usar String.Format("{0:MyCustomFormat}", new MyOwnClass()) porque esto llama implícitamente MyOwnClass.ToString()


Y para responder a su tercera pregunta: eso no es posible con esta sintaxis, pero puede proporcionar instancias de IFormatProvider e ICustomFormatter para un tipo que no creó, o implementar IFormattable dentro de su tipo (aunque, básicamente, se extiende a ToString ).


String.Format compara cada uno de los tokens dentro de la cadena ( {0} etc.) con el objeto correspondiente: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Una cadena de formato se proporciona opcionalmente:

{ index[,alignment][ : formatString] }

Si se proporciona formatString , el objeto correspondiente debe implementar IFormattable y específicamente el método ToString que acepta formatString y devuelve la cadena formateada correspondiente: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx

También se puede IFormatProvider un IFormatProvider que se puede usar para capturar estándares / valores predeterminados de formato, etc. Ejemplos here y codeproject.com/Articles/6533/Custom-String-Formatting-in-NET .

Entonces las respuestas a sus preguntas en orden:

  1. Utiliza el IFormattable ToString() la interfaz ToString() en el objeto DateTime y lo pasa en la cadena de formato MM/dd/yyyy . Es esa implementación la que devuelve la cadena correcta.

  2. Cualquier objeto que implemente IFormattable admite esta característica. ¡Incluso puedes escribir el tuyo!

  3. Sí, mira arriba.