c# - miles - String.Format: cómo funciona y cómo implementar cadenas de formatos personalizados
string format c# separador de miles (7)
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".
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) .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:
- ¿Cómo
String.Format
la información adicionalMM/dd/yyyy
a un resultado de cadena? - ¿Todos los objetos de Microsoft admiten esta característica?
¿Está esto documentado en alguna parte? - ¿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,
¿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.
¿Todos los objetos de Microsoft admiten esta característica? ¿Está esto documentado en alguna parte?
Todo lo que implementa IFormattable lo hace.
¿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:
Utiliza el
IFormattable
ToString()
la interfazToString()
en el objetoDateTime
y lo pasa en la cadena de formatoMM/dd/yyyy
. Es esa implementación la que devuelve la cadena correcta.Cualquier objeto que implemente
IFormattable
admite esta característica. ¡Incluso puedes escribir el tuyo!Sí, mira arriba.