2012-05-09 14 views
76

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 - cómo funciona y cómo implementar las cadenas de formatos personalizados

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

Pero no tengo ni idea de cómo funciona y qué clases de apoyo a estas cadenas adicionales 'Magic'.

Así que mis preguntas son:

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

Usted puede echar un vistazo a este http://www.codeproject.com/Articles/6533/Custom-String-Formatting-in-NET – V4Vendetta

Respuesta

79

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

se proporciona opcionalmente una cadena de formato:

{ index[,alignment][ : formatString] }

Si formatString se proporciona, los correspondientes el objeto 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 usar un IFormatProvider que se puede utilizar para capturar estándares/valores predeterminados de formato, etc. Ejemplos here y here.

Así que las respuestas a sus preguntas en orden:

  1. Utiliza el método de la interfaz IFormattableToString() en el objeto DateTime y pasa que la cadena MM/dd/yyyy formato. 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í, ver arriba.

+9

+1 para vincular a ** la documentación **. "Buscar en Internet" puede estar bien. Pero cuando necesite una comprensión más profunda, debería leer el manual. – MarkJ

+0

Buena respuesta, pero ¿puede decirme dónde puedo encontrar para cada clase que implemente 'IFormattable', donde puedo encontrar las cadenas de formato permitidas. Por ejemplo, DateTime admite (en la parte superior de mi cabeza) 'y M d h m s' y más. Los tipos numéricos admiten 'C' de la moneda, pero eso es todo lo que sé de la búsqueda y no al mirar la documentación de Microsoft. – hwcverwe

+0

@hwcverwe: casi todas las búsquedas de Google colocarán la documentación de MSDN en la búsqueda de cualquier objeto o cerca de ella. Búsqueda de cadenas. No habrá una sola página que muestre ToString (...) para cada objeto; potencialmente hay una cantidad "infinita" de ellos, porque por defecto todos los objetos implementan al menos ToString(), aunque no necesariamente ToString (formato). –

0

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

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

+0

-1 - El PO está pidiendo algo más que 'DateTime' formato. Y solo un enlace no es una respuesta. – Oded

+1

Muy duro. DateTime es uno de los aspectos y estaba expandiendo mi respuesta mientras bajaba la votación. –

+6

Expanda la respuesta _entonces publicación_, y no obtendrá downvoted. – Oded

16

Según tengo entendido, deberá implementar IFormattable en su clase para admitir 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()) 
0

La documentación para las fechas se puede encontrar aquí: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

que usted debe saber exactamente lo que todos los caracteres de formato fecha como mm Media.

Si desea cambiar la forma de una cadena se emite para una clase personalizada, puede reemplazar 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 entonces sólo puede hacer algo como myUser.ToString() y obtener la salida que especificado.

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

  2. Hasta donde yo 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 el formato generalmente se proporciona en cualquier lugar donde se necesite (o para decirlo de otra manera, solo he escrito formateadores personalizados para mí tipos).

  3. Sí, usted puede escribir su propia y si tiene datos que se pueden formatear en diferentes formas en las que, probablemente, debe escribir un formateador personalizado mediante la implementación de IFormattable, volver a ver los documentos aquí: http://msdn.microsoft.com/en-us/library/system.iformattable.aspx. Es bastante sencillo, sólo tiene que comprobar las cadenas proporcionadas y escribir sus datos en función de éstos, no hay magia detrás de las escenas :-)

0

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

3

Under the covers String.Formato 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 funciona String.Format mapear la información adicional MM/dd/aaaa a consecuencia de cuerdas?

    Como se especifica anteriormente, solo llama a IFO .Magtable .ToString (formato de cadena, proveedor IFormatProvider). 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 función? ¿Está esto documentado en alguna parte?

    Cualquier cosa que implemente IFormattable lo hace.

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

    Esencialmente si desea que su propio objeto de hacer algo con el formato proporcionado a implementar IFormattable.

Hay un gran número de clases de apoyo y enumeradores para asegurar sin embargo que las cadenas de formato son en gran medida similar. More here.

Cuestiones relacionadas