Cadena.Formato

Cadena.Formato

El Format Los métodos son un conjunto de sobrecargas en el System.String clase utilizada para crear cadenas que combinan objetos en representaciones de cadenas específicas. Esta información se puede aplicar a String.Format , varios WriteLine así como otros métodos en el marco .NET.

# Desde C# 6.0

Desde C# 6.0 es posible usar la interpolación de cadenas en lugar de String.Format .

string name = "John";
string lastname = "Doe";
Console.WriteLine($"Hello {name} {lastname}!");

¡Hola John Doe!

Más ejemplos de esto en el tema Características de C# 6.0:interpolación de cadenas.

# Lugares donde String.Format está 'incrustado' en el marco

Hay varios lugares donde puedes usar String.Format indirectamente :El secreto es buscar la sobrecarga con la firma string format, params object[] args , por ejemplo:

Console.WriteLine(String.Format("{0} - {1}", name, value));

Se puede reemplazar con una versión más corta:

Console.WriteLine("{0} - {1}", name, value);

Hay otros métodos que también usan String.Format por ejemplo:

Debug.WriteLine(); // and Print()
StringBuilder.AppendFormat();

# Crea un proveedor de formato personalizado

public class CustomFormat : IFormatProvider, ICustomFormatter
{
    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (!this.Equals(formatProvider))
        {
            return null;
        }

        if (format == "Reverse")
        {
            return String.Join("", arg.ToString().Reverse());
        }

        return arg.ToString();
    }

    public object GetFormat(Type formatType)
    {
        return formatType==typeof(ICustomFormatter) ? this:null;
    }
}

Uso:

String.Format(new CustomFormat(), "-> {0:Reverse} <-", "Hello World");

Salida:

-> dlroW olleH <-

# Formato de fecha

DateTime date = new DateTime(2016, 07, 06, 18, 30, 14);
// Format: year, month, day hours, minutes, seconds

Console.Write(String.Format("{0:dd}",date)); 

//Format by Culture info
String.Format(new System.Globalization.CultureInfo("mn-MN"),"{0:dddd}",date);

Console.Write($"{date:ddd}");

salida:

06
Лхагва
06

Especificador Significado Muestra Resultado
d Fecha {0:d} 7/6/2016
dd Día, relleno con ceros {0:dd} 06
ddd Nombre de día corto {0:ddd} miércoles
dddd Nombre completo del día {0:dddd} miércoles
D Fecha larga {0:D} miércoles, 6 de julio de 2016
f Fecha y hora completa, abreviada {0:f} miércoles, 6 de julio de 2016 18:30
ff Segundas fracciones, 2 dígitos {0:ff} 20
fff Segundas fracciones, 3 dígitos {0:fff} 201
ffff Segundas fracciones, 4 dígitos {0:ffff} 2016
F Fecha y hora completas, largas {0:F} miércoles, 6 de julio de 2016 18:30:14
g Fecha y hora predeterminadas {0:g} 6/7/2016 18:30
gg Era {0:gg} A.D
hh Hora (2 dígitos, 12H) {0:hh} 06
HH Hora (2 dígitos, 24H) {0:HH} 18
M Mes y día {0:M} 6 de julio
mm Minutos, relleno con ceros {0:mm} 30
MM Mes, relleno con ceros {0:MM} 07
MMM Nombre del mes de 3 letras {0:MMM} julio
MMMM Nombre completo del mes {0:MMMM} julio
ss Segundos {0:ss} 14
r Fecha RFC1123 {0:r} miércoles, 06 de julio de 2016 18:30:14 GMT
s Cadena de fecha ordenable {0:s} 2016-07-06T18:30:14
t Poco tiempo {0:t} 18:30
T Mucho tiempo {0:T} 18:30:14
tt AM/PM {0:tt} PM
u Hora local ordenable universal {0:u} 2016-07-06 18:30:14Z
T GMT universal {0:U} miércoles, 6 de julio de 2016 9:30:14
Y Mes y año {0:Y} Julio de 2016
aa año de 2 dígitos {0:yy} 16
aaaa año de 4 dígitos {0:yyyy} 2016
zz desplazamiento de zona horaria de 2 dígitos {0:zz} +09
zzz compensación de zona horaria completa {0:zzz} +09:00

# Formato de moneda

El especificador de formato "c" (o moneda) convierte un número en una cadena que representa una cantidad de moneda.

string.Format("{0:c}", 112.236677) // $112.23 - defaults to system

# Precisión

El valor predeterminado es 2. Utilice c1, c2, c3, etc. para controlar la precisión.

string.Format("{0:C1}", 112.236677) //$112.2
string.Format("{0:C3}", 112.236677) //$112.237
string.Format("{0:C4}", 112.236677) //$112.2367
string.Format("{0:C9}", 112.236677) //$112.236677000

# símbolo de moneda

  1. Pase CultureInfo instancia para usar el símbolo cultural personalizado.
string.Format(new CultureInfo("en-US"), "{0:c}", 112.236677); //$112.24
string.Format(new CultureInfo("de-DE"), "{0:c}", 112.236677); //112,24 €
string.Format(new CultureInfo("hi-IN"), "{0:c}", 112.236677); //₹ 112.24

  1. Utilice cualquier cadena como símbolo de moneda. Usa NumberFormatInfo como para personalizar el símbolo de moneda.
NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;
nfi = (NumberFormatInfo) nfi.Clone();
nfi.CurrencySymbol = "?";
string.Format(nfi, "{0:C}", 112.236677); //?112.24
nfi.CurrencySymbol = "?%^&";
string.Format(nfi, "{0:C}", 112.236677); //?%^&112.24

# Posición del símbolo de moneda

Use CurrencyPositivePattern para valores positivos y CurrencyNegativePattern para valores negativos.

NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;        
nfi.CurrencyPositivePattern = 0;
string.Format(nfi, "{0:C}", 112.236677); //$112.24 - default
nfi.CurrencyPositivePattern = 1;
string.Format(nfi, "{0:C}", 112.236677); //112.24$
nfi.CurrencyPositivePattern = 2;
string.Format(nfi, "{0:C}", 112.236677); //$ 112.24
nfi.CurrencyPositivePattern = 3; 
string.Format(nfi, "{0:C}", 112.236677); //112.24 $

El uso del patrón negativo es el mismo que el patrón positivo. Muchos más casos de uso, consulte el enlace original.

# Separador decimal personalizado

NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;        
nfi.CurrencyPositivePattern = 0;
nfi.CurrencyDecimalSeparator = "..";
string.Format(nfi, "{0:C}", 112.236677); //$112..24

# Uso de formato de número personalizado

NumberFormatInfo se puede utilizar para dar formato a números enteros y flotantes.

// invariantResult is "1,234,567.89"
var invarianResult = string.Format(CultureInfo.InvariantCulture, "{0:#,###,##}", 1234567.89);

// NumberFormatInfo is one of classes that implement IFormatProvider
var customProvider = new NumberFormatInfo
{
    NumberDecimalSeparator = "_NS_", // will be used instead of ','
    NumberGroupSeparator = "_GS_", // will be used instead of '.'
};

// customResult is "1_GS_234_GS_567_NS_89"
var customResult = string.Format(customProvider, "{0:#,###.##}", 1234567.89);

# Alinear a la izquierda/derecha, rellenar con espacios

El segundo valor entre llaves dicta la longitud de la cadena de reemplazo. Al ajustar el segundo valor para que sea positivo o negativo, se puede cambiar la alineación de la cadena.

string.Format("LEFT:  string: ->{0,-5}<- int: ->{1,-5}<-", "abc", 123);
string.Format("RIGHT: string: ->{0,5}<- int: ->{1,5}<-", "abc", 123);

Salida:

LEFT:  string: ->abc  <- int: ->123  <-
RIGHT: string: ->  abc<- int: ->  123<-

# formatos numéricos

// Integral types as hex
string.Format("Hexadecimal: byte2: {0:x2}; byte4: {0:X4}; char: {1:x2}", 123, (int)'A');

// Integers with thousand separators
string.Format("Integer, thousand sep.: {0:#,#}; fixed length: >{0,10:#,#}<", 1234567);

// Integer with leading zeroes
string.Format("Integer, leading zeroes: {0:00}; ", 1);

// Decimals
string.Format("Decimal, fixed precision: {0:0.000}; as percents: {0:0.00%}", 0.12);

Salida:

Hexadecimal: byte2: 7b; byte4: 007B; char: 41
Integer, thousand sep.: 1,234,567; fixed length: > 1,234,567<
Integer, leading zeroes: 01; 
Decimal, fixed precision: 0.120; as percents: 12.00%

# Escapar de corchetes dentro de una expresión String.Format()

string outsidetext = "I am outside of bracket";
string.Format("{{I am in brackets!}} {0}", outsidetext);

//Outputs "{I am in brackets!} I am outside of bracket"

#ToString()

El método ToString() está presente en todos los tipos de objetos de referencia. Esto se debe a que todos los tipos de referencia se derivan de Object que tiene el método ToString(). El método ToString() en la clase base del objeto devuelve el nombre del tipo. El siguiente fragmento imprimirá "Usuario" en la consola.

public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
}

...

var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());

Sin embargo, la clase User también puede anular ToString() para modificar la cadena que devuelve. El siguiente fragmento de código imprime "Id:5, Nombre:Usuario1" en la consola.

public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
    public override ToString()
    {
        return string.Format("Id: {0}, Name: {1}", Id, Name);
    }
}

...

var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());

# Relación con ToString()

Mientras que el String.Format() El método es ciertamente útil para formatear datos como cadenas, a menudo puede ser un poco exagerado, especialmente cuando se trata de un solo objeto como se ve a continuación:

String.Format("{0:C}", money);  // yields "$42.00"

Un enfoque más fácil podría ser simplemente usar el ToString() disponible en todos los objetos dentro de C#. Admite todas las mismas cadenas de formato estándar y personalizadas, pero no requiere la asignación de parámetros necesaria ya que solo habrá un único argumento:

money.ToString("C");  // yields "$42.00"

# Advertencias y restricciones de formato

Si bien este enfoque puede ser más simple en algunos escenarios, el ToString() el enfoque está limitado con respecto a agregar relleno izquierdo o derecho como lo haría dentro del String.Format() método :

String.Format("{0,10:C}", money);  // yields "    $42.00"

Para lograr este mismo comportamiento con el ToString() método, necesitaría usar otro método como PadLeft() o PadRight() respectivamente :

money.ToString("C").PadLeft(10);  // yields "    $42.00"

# Sintaxis

  • string.Format(formato de cadena, objeto params[] argumentos)
  • cadena.Format(proveedor IFormatProvider, formato de cadena, objeto params[] argumentos)
  • $"cadena {texto} blablabla" // Desde C#6

# Parámetros

Parámetro Detalles
formato Una cadena de formato compuesto, que define la forma en que args debe combinarse en una cadena.
argumentos Una secuencia de objetos que se combinarán en una cadena. Ya que esto usa un params argumento, puede usar una lista de argumentos separados por comas o una matriz de objetos real.
proveedor Una colección de formas de formatear objetos en cadenas. Los valores típicos incluyen CultureInfo.InvariantCulture y CultureInfo.CurrentCulture .

# Comentarios

Notas:

  • String.Format() maneja null argumentos sin lanzar una excepción.
  • Hay sobrecargas que reemplazan el args parámetro con uno, dos o tres parámetros de objeto.