String.Format Método

Definición

Convierte el valor de los objetos en cadenas en función de los formatos especificados y los inserta en otra cadena.

Si aún no conoce el método String.Format, vea un resumen rápido en la sección Empezar a trabajar con el método String.Format.

Vea documentación general sobre el método String.Format en la sección Comentarios.

Sobrecargas

Format(String, Object)

Reemplaza uno o más elementos de formato de una cadena por la representación de cadena de un objeto especificado.

Format(String, Object[])

Reemplaza el elemento de formato de una cadena especificada por la representación de cadena de un objeto correspondiente de una matriz especificada.

Format(IFormatProvider, String, Object)

Sustituye el elemento o elementos de formato en una cadena específica con la representación de cadena del objeto correspondiente. Un parámetro proporciona información de formato específica de la referencia cultural.

Format(IFormatProvider, String, Object[])

Reemplaza los elementos de formato de una cadena por las representaciones de cadena de los objetos correspondientes en una matriz especificada. Un parámetro proporciona información de formato específica de la referencia cultural.

Format(String, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de dos objetos especificados.

Format(IFormatProvider, String, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de dos objetos especificados. Un parámetro proporciona información de formato específica de la referencia cultural.

Format(String, Object, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de tres objetos especificados.

Format(IFormatProvider, String, Object, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de tres objetos especificados. Un parámetro proporciona información de formato específica de la referencia cultural.

Ejemplos

En la sección Comentarios de este artículo se intercalan numerosos ejemplos que llaman Format al método .

También puede descargar un conjunto completo de String.Format ejemplos, que incluyen un proyecto de .NET Core para C#.

A continuación se muestran algunos de los ejemplos incluidos en el artículo:

Creación de una cadena de formato

Inserción de una cadena
Elemento de formato
Dar formato a los elementos que tienen el mismo índice

Salida con formato de control

Control del formato
Control del espaciado
Controlar la alineación
Controlar el número de dígitos enteros
Controlar el número de dígitos después del separador decimal
Incluir llaves literales en una cadena de resultado

Hacer que las cadenas de formato distinguen la referencia cultural

Formatos que distinguen la referencia cultural

Personalización de la operación de formato

Una operación de formato personalizada
Un proveedor de interceptación y un formateador de números román

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

En esta sección:

Introducción al método String.Format
¿A qué método se llama?
El método Format en resumen
El elemento Format
Cómo se formatearán los argumentos
Dar formato a los elementos que tienen el mismo índice
Formato y referencia cultural
Operaciones de formato personalizadas
String.Format Q & A

Introducción al método String.Format

Use String.Format si necesita insertar el valor de un objeto, variable o expresión en otra cadena. Por ejemplo, puede insertar el valor de un valor en una cadena para mostrarlo al Decimal usuario como una sola cadena:

Decimal pricePerOunce = (Decimal)17.36;
String^ s = String::Format("The current price is {0} per ounce.",
                           pricePerOunce);
// Result: The current price is 17.36 per ounce.
Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0} per ounce.",
                         pricePerOunce);
Console.WriteLine(s);
// Result: The current price is 17.36 per ounce.
Dim pricePerOunce As Decimal = 17.36d
Dim s As String = String.Format("The current price is {0} per ounce.",
                                pricePerOunce)
' Result: The current price is 17.36 per ounce.

Y puede controlar el formato de ese valor:

Decimal pricePerOunce = (Decimal)17.36;
String^ s = String::Format("The current price is {0:C2} per ounce.",
                           pricePerOunce);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.
Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0:C2} per ounce.",
                         pricePerOunce);
Console.WriteLine(s);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.
Dim pricePerOunce As Decimal = 17.36d
Dim s As String = String.Format("The current price is {0:C2} per ounce.",
                                pricePerOunce)
' Result if current culture is en-US:
'      The current price is $17.36 per ounce.

Además del formato, también puede controlar la alineación y el espaciado.

Inserción de una cadena

String.Format comienza con una cadena de formato, seguida de uno o varios objetos o expresiones que se convertirán en cadenas e insertarán en un lugar especificado de la cadena de formato. Por ejemplo:

Decimal temp = (Decimal)20.4;
String^ s = String::Format("The temperature is {0}°C.", temp);
Console::WriteLine(s);
// Displays 'The temperature is 20.4°C.'
decimal temp = 20.4m;
string s = String.Format("The temperature is {0}°C.", temp);
Console.WriteLine(s);
// Displays 'The temperature is 20.4°C.'
Dim temp As Decimal = 20.4d
Dim s As String = String.Format("The temperature is {0}°C.", temp)
Console.WriteLine(s)
' Displays 'The temperature is 20.4°C.'

en {0} la cadena de formato es un elemento de formato. 0 es el índice del objeto cuyo valor de cadena se insertará en esa posición. (Los índices comienzan en 0). Si el objeto que se va a insertar no es una cadena, se llama a su método para convertirlo en uno antes de ToString insertarlo en la cadena de resultado.

Este es otro ejemplo que usa dos elementos de formato y dos objetos en la lista de objetos:

String^ s = String::Format("At {0}, the temperature is {1}°C.",
                           DateTime::Now, 20.4);
// Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'
string s = String.Format("At {0}, the temperature is {1}°C.",
                         DateTime.Now, 20.4);
Console.WriteLine(s);
// Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'
Dim s As String = String.Format("At {0}, the temperature is {1}°C.",
                                Date.Now, 20.4)
' Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'

Puede tener tantos elementos de formato como objetos en la lista de objetos como desee, siempre que el índice de cada elemento de formato tenga un objeto correspondiente en la lista de objetos. Tampoco tiene que preocuparse por la sobrecarga a la que llama. el compilador seleccionará el adecuado para usted.

Formato de control

Puede seguir el índice en un elemento de formato con una cadena de formato para controlar cómo se formatee un objeto. Por ejemplo, {0:d} aplica la cadena de formato "d" al primer objeto de la lista de objetos. Este es un ejemplo con un único objeto y dos elementos de formato:

String^ s = String::Format("It is now {0:d} at {0:t}",
                           DateTime::Now);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'
string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now);
Console.WriteLine(s);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'
Dim s As String = String.Format("It is now {0:d} at {0:t}",
                                Date.Now)
' Output similar to: 'It is now 4/10/2015 at 10:04 AM'

Varios tipos admiten cadenas de formato, incluidos todos los tipos numéricos (cadenas de formato estándar y personalizado), todas las fechas y horas (cadenas de formato estándar y personalizado) e intervalos de tiempo (cadenas de formato estándar y personalizado), todos los tipos de enumeración de tipos de enumeración y GUID. También puede agregar compatibilidad con cadenas de formato a sus propios tipos.

Espaciado de control

Puede definir el ancho de la cadena que se inserta en la cadena de resultado mediante sintaxis como , que inserta una cadena de {0,12} 12 caracteres. En este caso, la representación de cadena del primer objeto se alinea a la derecha en el campo de 12 caracteres. (Sin embargo, si la representación de cadena del primer objeto tiene más de 12 caracteres de longitud, se omite el ancho de campo preferido y se inserta toda la cadena en la cadena de resultado).

En el ejemplo siguiente se define un campo de 6 caracteres para contener la cadena "Year" y algunas cadenas de año, así como un campo de 15 caracteres para contener la cadena "Population" y algunos datos de población. Tenga en cuenta que los caracteres están alineados a la derecha en el campo.

array<int>^ years = { 2013, 2014, 2015 };
array<int>^ population = { 1025632, 1105967, 1148203 };
StringBuiler^ sb = gcnew StringBuilder();
sb->Append(String::Format("{0,6} {1,15}\n\n", "Year", "Population"));
for(int index = 0; index < years->Length; index++)
   sb->AppendFormat("{0,6} {1,15:N0}\n",
                    years[index], population[index]);
// Result:
//      Year      Population
//
//      2013       1,025,632
//      2014       1,105,967
//      2015       1,148,203
     int[] years = { 2013, 2014, 2015 };
     int[] population = { 1025632, 1105967, 1148203 };
     var sb = new System.Text.StringBuilder();
     sb.Append(String.Format("{0,6} {1,15}\n\n", "Year", "Population"));
     for (int index = 0; index < years.Length; index++)
        sb.Append(String.Format("{0,6} {1,15:N0}\n", years[index], population[index]));

     Console.WriteLine(sb);

     // Result:
     //      Year      Population
     //
     //      2013       1,025,632
     //      2014       1,105,967
     //      2015       1,148,203
Dim years() As Integer = { 2013, 2014, 2015 }
Dim population() As Integer  = { 1025632, 1105967, 1148203 }
Dim sb As New StringBuilder()
sb.Append(String.Format("{0,6} {1,15}{2}{2}",
                        "Year", "Population", vbCrLf))
For index As Integer = 0 To years.Length - 1
   sb.AppendFormat("{0,6} {1,15:N0}{2}",
                   years(index), population(index), vbCrLf)
Next
' Result:
'      Year      Population
'
'      2013       1,025,632
'      2014       1,105,967
'      2015       1,148,203

Alineación del control

De forma predeterminada, las cadenas se alinean a la derecha dentro de su campo si se especifica un ancho de campo. Para alinear las cadenas a la izquierda en un campo, se anteirá el ancho del campo con un signo negativo, como para definir un campo alineado a la izquierda {0,-12} de 12 caracteres.

El ejemplo siguiente es similar al anterior, salvo que alinea a la izquierda las etiquetas y los datos.

array<int>^ years = { 2013, 2014, 2015 };
array<int>^ population = { 1025632, 1105967, 1148203 };
String^ s = String::Format("{0,-10} {1,-10}\n\n", "Year", "Population");
for(int index = 0; index < years->Length; index++)
   s += String::Format("{0,-10} {1,-10:N0}\n",
                      years[index], population[index]);
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203
int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population");
for(int index = 0; index < years.Length; index++)
   s += String.Format("{0,-10} {1,-10:N0}\n",
                      years[index], population[index]);
Console.WriteLine($"\n{s}");
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203
Dim years() As Integer = { 2013, 2014, 2015 }
Dim population() As Integer  = { 1025632, 1105967, 1148203 }
Dim s As String = String.Format("{0,-10} {1,-10}{2}{2}",
                                "Year", "Population", vbCrLf)
For index As Integer = 0 To years.Length - 1
   s += String.Format("{0,-10} {1,-10:N0}{2}",
                      years(index), population(index), vbCrLf)
Next
' Result:
'    Year       Population
'
'    2013       1,025,632
'    2014       1,105,967
'    2015       1,148,203

String.Format usa la característica de formato compuesto. Para obtener más información, consulte Formatos compuestos.

¿A qué método se llama?

En Call
Dar formato a uno o varios objetos mediante las convenciones de la referencia cultural actual. Excepto para las sobrecargas que incluyen un provider parámetro , las sobrecargas restantes incluyen un parámetro seguido de uno o varios parámetros de Format String objeto. Por este problema, no tiene que determinar a qué Format sobrecarga va a llamar. El compilador de lenguaje selecciona la sobrecarga adecuada entre las sobrecargas que no tienen un parámetro, en provider función de la lista de argumentos. Por ejemplo, si la lista de argumentos tiene cinco argumentos, el compilador llama al Format(String, Object[]) método .
Dar formato a uno o varios objetos mediante las convenciones de una referencia cultural específica. Cada Format sobrecarga que comienza con un parámetro va seguida de un parámetro y uno o varios parámetros de provider String objeto. Por este problema, no tiene que determinar a qué sobrecarga Format específica va a llamar. El compilador de lenguaje selecciona la sobrecarga adecuada entre las sobrecargas que tienen un provider parámetro, en función de la lista de argumentos. Por ejemplo, si la lista de argumentos tiene cinco argumentos, el compilador llama al Format(IFormatProvider, String, Object[]) método .
Realice una operación de formato personalizada con una ICustomFormatter implementación o una IFormattable implementación. Cualquiera de las cuatro sobrecargas con un provider parámetro . El compilador selecciona la sobrecarga adecuada entre las sobrecargas que tienen un provider parámetro, en función de la lista de argumentos.

El método Format en resumen

Cada sobrecarga del método usa la característica de formato compuesto para incluir marcadores de posición indizados de base cero, denominados elementos de formato Format , en una cadena de formato compuesto. En tiempo de ejecución, cada elemento de formato se reemplaza por la representación de cadena del argumento correspondiente en una lista de parámetros. Si el valor del argumento es null , el elemento de formato se reemplaza por String.Empty . Por ejemplo, la siguiente llamada al método incluye una cadena de formato con tres elementos de formato, , y , y una lista de argumentos Format(String, Object, Object, Object) {0} con tres {1} {2} elementos.

using namespace System;

void main()
{
   DateTime^ dat = gcnew DateTime(2012, 1, 17, 9, 30, 0); 
   String^ city = "Chicago";
   int temp = -16;
   String^ output = String::Format("At {0} in {1}, the temperature was {2} degrees.",
                                   dat, city, temp);
   Console::WriteLine(output);
}
// The example displays the following output: 
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.
DateTime dat = new DateTime(2012, 1, 17, 9, 30, 0); 
string city = "Chicago";
int temp = -16;
string output = String.Format("At {0} in {1}, the temperature was {2} degrees.",
                              dat, city, temp);
Console.WriteLine(output);
// The example displays output like the following:
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.
Dim dat As Date = #1/17/2012 9:30AM# 
Dim city As String = "Chicago"
Dim temp As Integer = -16
Dim output As String = String.Format("At {0} in {1}, the temperature was {2} degrees.",
                                     dat, city, temp)
Console.WriteLine(output)
' The example displays the following output:
'    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.

Elemento de formato

Un elemento de formato tiene esta sintaxis:

{index[,alignment][:formatString]}

Los corchetes denotan elementos opcionales. Se requieren las llaves de apertura y cierre. (Para incluir una llave de apertura o cierre literal en la cadena de formato, vea la sección Llaves de escape del artículo Formato compuesto).

Por ejemplo, un elemento de formato para dar formato a un valor de moneda podría aparecer de la siguiente forma:

String::Format("{0,-10:C}", (Decimal) 126347.89);
var value = String.Format("{0,-10:C}", 126347.89m);         
Console.WriteLine(value);
String.Format("{0,-10:C}", 126347.89d)

Un elemento de formato tiene los siguientes elementos:

index
Índice de base cero del argumento cuya representación de cadena se va a incluir en esta posición de la cadena. Si este argumento es , se incluirá una cadena vacía null en esta posición de la cadena.

Alineación
Opcional. Entero con signo que indica la longitud total del campo en el que se inserta el argumento y si está alineado a la derecha (un entero positivo) o alineado a la izquierda (un entero negativo). Si omite la alineación, la representación de cadena del argumento correspondiente se inserta en un campo sin espacios iniciales o finales.

Si el valor de alignment es menor que la longitud del argumento que se va a insertar, la alineación se omite y la longitud de la representación de cadena del argumento se usa como ancho de campo.

formatString
Opcional. Cadena que especifica el formato de la cadena de resultado del argumento correspondiente. Si omite formatString, se llama al método sin parámetros del argumento ToString correspondiente para generar su representación de cadena. Si especifica formatString, el argumento al que hace referencia el elemento de formato debe implementar la IFormattable interfaz . Los tipos que admiten cadenas de formato incluyen:

Sin embargo, tenga en cuenta que cualquier tipo personalizado puede implementar IFormattable o ampliar la implementación de un tipo IFormattable existente.

En el ejemplo siguiente se usan alignment los formatString argumentos y para generar resultados con formato.

using namespace System;

void main()
{
   // Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
   array<Tuple<String^, DateTime, int, DateTime, int>^>^ cities = gcnew array<Tuple<String^, DateTime, int, DateTime, int>^> 
         { gcnew Tuple<String^, DateTime, int, DateTime, int>("Los Angeles", DateTime(1940, 1, 1), 1504277, 
                        DateTime(1950, 1, 1), 1970358),
         gcnew Tuple<String^, DateTime, int, DateTime, int>("New York", DateTime(1940, 1, 1), 7454995, 
                        DateTime(1950, 1, 1), 7891957),  
         gcnew Tuple<String^, DateTime, int, DateTime, int>("Chicago", DateTime(1940, 1, 1), 3396808, 
                        DateTime(1950, 1, 1), 3620962),  
         gcnew Tuple<String^, DateTime, int, DateTime, int>("Detroit", DateTime(1940, 1, 1), 1623452, 
                        DateTime(1950, 1, 1), 1849568) };

   // Display header
   String^ header = String::Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                                   "City", "Year", "Population", "Change (%)");
   Console::WriteLine(header);
   String^ output;      
   for each (Tuple<String^, DateTime, int, DateTime, int>^ city in cities) {
      output = String::Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                              city->Item1, city->Item2, city->Item3, city->Item4, city->Item5,
                              (city->Item5 - city->Item3)/ (double)city->Item3);
      Console::WriteLine(output);
   }
}
// The example displays the following output:
//    City            Year  Population    Year  Population    Change (%)
//    
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
//    New York        1940   7,454,995    1950   7,891,957         5.9 %
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %
// Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
Tuple<string, DateTime, int, DateTime, int>[] cities = 
    { Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277, 
                   new DateTime(1950, 1, 1), 1970358),
      Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995, 
                   new DateTime(1950, 1, 1), 7891957),  
      Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808, 
                   new DateTime(1950, 1, 1), 3620962),  
      Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452, 
                   new DateTime(1950, 1, 1), 1849568) };

// Display header
var header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                              "City", "Year", "Population", "Change (%)");
Console.WriteLine(header);
foreach (var city in cities) {
   var output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                          city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                          (city.Item5 - city.Item3)/ (double)city.Item3);
   Console.WriteLine(output);
}
// The example displays the following output:
//    City            Year  Population    Year  Population    Change (%)
//  
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
//    New York        1940   7,454,995    1950   7,891,957         5.9 %
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %
Module Example
   Public Sub Main()
      ' Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
      Dim cities()  = _
          { Tuple.Create("Los Angeles", #1/1/1940#, 1504277, #1/1/1950#, 1970358),
            Tuple.Create("New York", #1/1/1940#, 7454995, #1/1/1950#, 7891957),  
            Tuple.Create("Chicago", #1/1/1940#, 3396808, #1/1/1950#, 3620962),  
            Tuple.Create("Detroit", #1/1/1940#, 1623452, #1/1/1950#, 1849568) }

      ' Display header
      Dim header As String = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}",
                                           "City", "Year", "Population", "Change (%)")
      Console.WriteLine(header)
      Console.WriteLine()
      For Each city In cities
         Dim output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                                city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                                (city.Item5 - city.Item3)/city.Item3)
         Console.WriteLine(output)
      Next
   End Sub
End Module
' The example displays the following output:
'    City            Year  Population    Year  Population    Change (%)
'    
'    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
'    New York        1940   7,454,995    1950   7,891,957         5.9 %
'    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
'    Detroit         1940   1,623,452    1950   1,849,568        13.9 %

Cómo se formatearán los argumentos

Los elementos de formato se procesan secuencialmente desde el principio de la cadena. Cada elemento de formato tiene un índice que corresponde a un objeto en la lista de argumentos del método. El Format método recupera el argumento y deriva su representación de cadena de la siguiente manera:

Para obtener un ejemplo que intercepta las llamadas al método y le permite ver qué información pasa el método a un método de formato para cada elemento de formato de una cadena de formato compuesto, vea Ejemplo: Un proveedor de interceptación y formateador de números ICustomFormatter.Format Format román.

Para obtener más información, vea la sección Orden de procesamiento del artículo Formato compuesto.

Dar formato a los elementos que tienen el mismo índice

El método produce una excepción si el índice de un elemento de índice es mayor o igual que el número de Format FormatException argumentos de la lista de argumentos. Sin embargo, puede incluir más elementos de formato que argumentos, siempre y cuando varios elementos format de formato tengan el mismo índice. En la llamada al método en el ejemplo siguiente, la lista de argumentos tiene un único argumento, pero la cadena de formato incluye dos elementos de formato: uno muestra el valor decimal de un número y el otro muestra su Format(String, Object) valor hexadecimal.

short[] values= { Int16.MinValue, -27, 0, 1042, Int16.MaxValue };
Console.WriteLine("{0,10}  {1,10}\n", "Decimal", "Hex");
foreach (short value in values)
{
   string formatString = String.Format("{0,10:G}: {0,10:X}", value);
   Console.WriteLine(formatString);
}   
// The example displays the following output:
//       Decimal         Hex
//    
//        -32768:       8000
//           -27:       FFE5
//             0:          0
//          1042:        412
//         32767:       7FFF
Module Example
   Public Sub Main()
      Dim values() As Short = { Int16.MinValue, -27, 0, 1042, Int16.MaxValue }
      Console.WriteLine("{0,10}  {1,10}", "Decimal", "Hex")
      Console.WriteLine()
      For Each value As Short In values
         Dim formatString As String = String.Format("{0,10:G}: {0,10:X}", value)
         Console.WriteLine(formatString)
      Next        
   End Sub
End Module
' The example displays the following output:
'       Decimal         Hex
'    
'        -32768:       8000
'           -27:       FFE5
'             0:          0
'          1042:        412
'         32767:       7FFF

Formato y referencia cultural

Por lo general, los objetos de la lista de argumentos se convierten en sus representaciones de cadena mediante las convenciones de la referencia cultural actual, que devuelve la CultureInfo.CurrentCulture propiedad . Puede controlar este comportamiento llamando a una de las sobrecargas de Format que incluye un parámetro provider . El parámetro es una implementación que proporciona información de formato personalizada y específica de la referencia cultural que provider IFormatProvider se usa para moderar el proceso de formato.

La IFormatProvider interfaz tiene un único miembro, , que es responsable de devolver el objeto que proporciona información de GetFormat formato. .NET tiene tres IFormatProvider implementaciones que proporcionan formato específico de la referencia cultural:

  • CultureInfo. Su método devuelve un objeto específico de la referencia cultural para dar formato a valores numéricos y un objeto específico de la referencia cultural para dar formato a los valores GetFormat NumberFormatInfo de fecha y DateTimeFormatInfo hora.

  • DateTimeFormatInfo, que se usa para el formato específico de la referencia cultural de los valores de fecha y hora. Su GetFormat método se devuelve a sí mismo.

  • NumberFormatInfo, que se usa para el formato específico de la referencia cultural de valores numéricos. Su GetFormat propiedad se devuelve a sí misma.

Operaciones de formato personalizadas

También puede llamar a cualquiera de las sobrecargas del método que tienen un parámetro de Format tipo para realizar operaciones de formato provider IFormatProvider personalizadas. Por ejemplo, podría dar formato a un entero como un número de identificación o como un número de teléfono. Para realizar el formato personalizado, el provider argumento debe implementar las IFormatProvider ICustomFormatter interfaces y . Cuando se Format pasa al método una implementación como argumento, el método llama a su implementación y ICustomFormatter solicita un objeto de tipo provider Format IFormatProvider.GetFormat ICustomFormatter . A continuación, llama al método del objeto devuelto para dar formato a cada elemento ICustomFormatter de formato de la cadena compuesta que se le Format pasa.

Para obtener más información sobre cómo proporcionar soluciones de formato personalizadas, vea Cómo: Definir y usar proveedores de formato numérico personalizado y ICustomFormatter . Para obtener un ejemplo que convierte enteros en números personalizados con formato, vea Ejemplo: una operación de formato personalizado. Para obtener un ejemplo que convierte bytes sin signo en números de román, vea Ejemplo: Un proveedor de interceptación y formateador de números de román.

Ejemplo: Una operación de formato personalizada

En este ejemplo se define un proveedor de formato que da formato a un valor entero como un número de cuenta de cliente con el formato x-xxxxx-xx.

using namespace System;

ref class CustomerFormatter : IFormatProvider, ICustomFormatter
{
public:
   virtual Object^ GetFormat(Type^ formatType) 
   {
      if (formatType == ICustomFormatter::typeid)        
         return this; 
      else 
         return nullptr; 
   }
   
   virtual String^ Format(String^ format, 
                   Object^ arg, 
                   IFormatProvider^ formatProvider) 
   {                       
      if (! this->Equals(formatProvider))
      {
         return nullptr;
      }
      else
      {
         if (String::IsNullOrEmpty(format)) 
            format = "G";
         
         String^ customerString = arg->ToString();
         if (customerString->Length < 8)
            customerString = customerString->PadLeft(8, '0');
         
         format = format->ToUpper();
         if (format == L"G") 
               return customerString->Substring(0, 1) + "-" +
                                     customerString->Substring(1, 5) + "-" +
                                     customerString->Substring(6);
         else if (format == L"S")                          
               return customerString->Substring(0, 1) + "/" +
                                     customerString->Substring(1, 5) + "/" +
                                     customerString->Substring(6);
         else if (format == L"P")
               return customerString->Substring(0, 1) + "." +
                                     customerString->Substring(1, 5) + "." +
                                     customerString->Substring(6);
         else
               throw gcnew FormatException( 
                         String::Format("The '{0}' format specifier is not supported.", format));
         }
    }   
};

void main()
{
   int acctNumber = 79203159;
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0}", acctNumber));
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:G}", acctNumber));
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:S}", acctNumber));
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:P}", acctNumber));
   try {
      Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:X}", acctNumber));
   }
   catch (FormatException^ e) {
      Console::WriteLine(e->Message);
   }
}
// The example displays the following output:
//       7-92031-59
//       7-92031-59
//       7/92031/59
//       7.92031.59
//       The 'X' format specifier is not supported.
using System;

public class TestFormatter
{
   public static void Main()
   {
      int acctNumber = 79203159;
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:G}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:S}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:P}", acctNumber));
      try {
         Console.WriteLine(String.Format(new CustomerFormatter(), "{0:X}", acctNumber));
      }
      catch (FormatException e) {
         Console.WriteLine(e.Message);
      }
   }
}

public class CustomerFormatter : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType) 
   {
      if (formatType == typeof(ICustomFormatter))        
         return this; 
      else
         return null;
   }
   
   public string Format(string format, 
                         object arg, 
                         IFormatProvider formatProvider) 
   {                       
      if (! this.Equals(formatProvider))
      {
         return null;
      }
      else
      {
         if (String.IsNullOrEmpty(format)) 
            format = "G";
         
         string customerString = arg.ToString();
         if (customerString.Length < 8)
            customerString = customerString.PadLeft(8, '0');
         
         format = format.ToUpper();
         switch (format)
         {
            case "G":
               return customerString.Substring(0, 1) + "-" +
                                     customerString.Substring(1, 5) + "-" +
                                     customerString.Substring(6);
            case "S":                          
               return customerString.Substring(0, 1) + "/" +
                                     customerString.Substring(1, 5) + "/" +
                                     customerString.Substring(6);
            case "P":                          
               return customerString.Substring(0, 1) + "." +
                                     customerString.Substring(1, 5) + "." +
                                     customerString.Substring(6);
            default:
               throw new FormatException( 
                         String.Format("The '{0}' format specifier is not supported.", format));
         }
      }   
   }
}
// The example displays the following output:
//       7-92031-59
//       7-92031-59
//       7/92031/59
//       7.92031.59
//       The 'X' format specifier is not supported.
Module TestFormatter
   Public Sub Main()
      Dim acctNumber As Integer = 79203159
      Console.WriteLine(String.Format(New CustomerFormatter, "{0}", acctNumber))
      Console.WriteLine(String.Format(New CustomerFormatter, "{0:G}", acctNumber))
      Console.WriteLine(String.Format(New CustomerFormatter, "{0:S}", acctNumber))
      Console.WriteLine(String.Format(New CustomerFormatter, "{0:P}", acctNumber))
      Try
         Console.WriteLine(String.Format(New CustomerFormatter, "{0:X}", acctNumber))
      Catch e As FormatException
         Console.WriteLine(e.Message)
      End Try   
   End Sub
End Module

Public Class CustomerFormatter : Implements IFormatProvider, ICustomFormatter
   Public Function GetFormat(type As Type) As Object  _
                   Implements IFormatProvider.GetFormat
      If type Is GetType(ICustomFormatter) Then
         Return Me
      Else
         Return Nothing
      End If
   End Function
   
   Public Function Format(fmt As String, _
                           arg As Object, _
                           formatProvider As IFormatProvider) As String _
                    Implements ICustomFormatter.Format
      If Not Me.Equals(formatProvider) Then
         Return Nothing
      Else
         If String.IsNullOrEmpty(fmt) Then fmt = "G"
         
         Dim customerString As String = arg.ToString()
         if customerString.Length < 8 Then _
            customerString = customerString.PadLeft(8, "0"c)
         
         Select Case fmt
            Case "G"
               Return customerString.Substring(0, 1) & "-" & _
                                     customerString.Substring(1, 5) & "-" & _
                                     customerString.Substring(6)
            Case "S"                         
               Return customerString.Substring(0, 1) & "/" & _
                                     customerString.Substring(1, 5) & "/" & _
                                     customerString.Substring(6)
            Case "P"
               Return customerString.Substring(0, 1) & "." & _
                                     customerString.Substring(1, 5) & "." & _
                                     customerString.Substring(6)
            Case Else
               Throw New FormatException( _
                         String.Format("The '{0}' format specifier is not supported.", fmt))
         End Select                                                     
      End If   
   End Function
End Class
' The example displays the following output:
'       7-92031-59
'       7-92031-59
'       7/92031/59
'       7.92031.59
'       The 'X' format specifier is not supported.

Ejemplo: un proveedor de interceptación y un formateador de números de román

En este ejemplo se define un proveedor de formato personalizado que implementa las ICustomFormatter IFormatProvider interfaces y para hacer dos cosas:

  • Muestra los parámetros pasados a su ICustomFormatter.Format implementación. Esto nos permite ver qué parámetros pasa el método a la implementación de formato personalizado para Format(IFormatProvider, String, Object[]) cada objeto al que intenta dar formato. Esto puede ser útil al depurar la aplicación.

  • Si el objeto al que se va a dar formato es un valor de byte sin signo al que se va a dar formato mediante la cadena de formato estándar "R", el formateador personalizado da formato al valor numérico como un número román.

using namespace System;
using namespace System::Globalization;

ref class InterceptProvider : IFormatProvider, ICustomFormatter
{
public:
   virtual Object^ GetFormat(Type^ formatType)
   {
      if (formatType == ICustomFormatter::typeid)   
         return this;
      else
         return nullptr;
   }
   
   virtual String^ Format(String^ format, Object^ obj, IFormatProvider^ provider) 
   {
      // Display information about method call.
      String^ formatString = format != nullptr ? format : "<null>";
      Console::WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, obj != nullptr ? obj : "<null>", formatString);
                        
      if (obj == nullptr) return String::Empty;
            
      // If this is a byte and the "R" format string, format it with Roman numerals.
      if (obj->GetType() == Byte::typeid && formatString->ToUpper()->Equals("R")) {
         Byte value = (Byte) obj;
         int remainder;
         int result;
         String^ returnString = String::Empty;

         // Get the hundreds digit(s)
         result = Math::DivRem(value, 100, remainder);
         if (result > 0)  
            returnString = gcnew String('C', result);
         value = (Byte) remainder;
         // Get the 50s digit
         result = Math::DivRem(value, 50, remainder);
         if (result == 1)
            returnString += "L";
         value = (Byte) remainder;
         // Get the tens digit.
         result = Math::DivRem(value, 10, remainder);
         if (result > 0)
            returnString += gcnew String('X', result);
         value = (Byte) remainder; 
         // Get the fives digit.
         result = Math::DivRem(value, 5, remainder);
         if (result > 0)
            returnString += "V";
         value = (Byte) remainder;
         // Add the ones digit.
         if (remainder > 0) 
            returnString += gcnew String('I', remainder);
         
         // Check whether we have too many X characters.
         int pos = returnString->IndexOf("XXXX");
         if (pos >= 0) {
            int xPos = returnString->IndexOf("L"); 
            if ((xPos >= 0) & (xPos == pos - 1))
               returnString = returnString->Replace("LXXXX", "XC");
            else
               returnString = returnString->Replace("XXXX", "XL");   
         }
         // Check whether we have too many I characters
         pos = returnString->IndexOf("IIII");
         if (pos >= 0)
            if (returnString->IndexOf("V") >= 0)
               returnString = returnString->Replace("VIIII", "IX");
            else
               returnString = returnString->Replace("IIII", "IV");    

         return returnString; 
      }   

      // Use default for all other formatting.
      if (obj->GetType() == IFormattable::typeid)
         return ((IFormattable^) obj)->ToString(format, CultureInfo::CurrentCulture);
      else
         return obj->ToString();
   }
};

void main()
{
   int n = 10;
   double value = 16.935;
   DateTime day = DateTime::Now;
   InterceptProvider^ provider = gcnew InterceptProvider();
   Console::WriteLine(String::Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day));
   Console::WriteLine(String::Format(provider, "{0}: {1:F}\n", "Today: ", 
                                    (DayOfWeek) DateTime::Now.DayOfWeek));
   Console::WriteLine(String::Format(provider, "{0:X}, {1}, {2}\n", 
                                    (Byte) 2, (Byte) 12, (Byte) 199));
   Console::WriteLine(String::Format(provider, "{0:R}, {1:R}, {2:R}\n", 
                                    (Byte) 2, (Byte) 12, (Byte) 199));
}
// The example displays the following output:
//    Provider: InterceptProvider, Object: 10, Format String: N0
//    Provider: InterceptProvider, Object: 16.935, Format String: C2
//    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
//    10: $16.94 on 1/31/2013
//    
//    Provider: InterceptProvider, Object: Today: , Format String: <null>
//    Provider: InterceptProvider, Object: Thursday, Format String: F
//    Today: : Thursday
//    
//    Provider: InterceptProvider, Object: 2, Format String: X
//    Provider: InterceptProvider, Object: 12, Format String: <null>
//    Provider: InterceptProvider, Object: 199, Format String: <null>
//    2, 12, 199
//    
//    Provider: InterceptProvider, Object: 2, Format String: R
//    Provider: InterceptProvider, Object: 12, Format String: R
//    Provider: InterceptProvider, Object: 199, Format String: R
//    II, XII, CXCIX
using System;
using System.Globalization;

public class InterceptProvider : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }
   
   public string Format(String format, Object obj, IFormatProvider provider) 
   {
      // Display information about method call.
      string formatString = format ?? "<null>";
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider.GetType().Name, obj ?? "<null>", formatString);
                        
      if (obj == null) return String.Empty;
            
      // If this is a byte and the "R" format string, format it with Roman numerals.
      if (obj is Byte && formatString.ToUpper().Equals("R")) {
         Byte value = (Byte) obj;
         int remainder;
         int result;
         String returnString = String.Empty;

         // Get the hundreds digit(s)
         result = Math.DivRem(value, 100, out remainder);
         if (result > 0)  
            returnString = new String('C', result);
         value = (Byte) remainder;
         // Get the 50s digit
         result = Math.DivRem(value, 50, out remainder);
         if (result == 1)
            returnString += "L";
         value = (Byte) remainder;
         // Get the tens digit.
         result = Math.DivRem(value, 10, out remainder);
         if (result > 0)
            returnString += new String('X', result);
         value = (Byte) remainder; 
         // Get the fives digit.
         result = Math.DivRem(value, 5, out remainder);
         if (result > 0)
            returnString += "V";
         value = (Byte) remainder;
         // Add the ones digit.
         if (remainder > 0) 
            returnString += new String('I', remainder);
         
         // Check whether we have too many X characters.
         int pos = returnString.IndexOf("XXXX");
         if (pos >= 0) {
            int xPos = returnString.IndexOf("L"); 
            if (xPos >= 0 & xPos == pos - 1)
               returnString = returnString.Replace("LXXXX", "XC");
            else
               returnString = returnString.Replace("XXXX", "XL");   
         }
         // Check whether we have too many I characters
         pos = returnString.IndexOf("IIII");
         if (pos >= 0)
            if (returnString.IndexOf("V") >= 0)
               returnString = returnString.Replace("VIIII", "IX");
            else
               returnString = returnString.Replace("IIII", "IV");    

         return returnString; 
      }   

      // Use default for all other formatting.
      if (obj is IFormattable)
         return ((IFormattable) obj).ToString(format, CultureInfo.CurrentCulture);
      else
         return obj.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      int n = 10;
      double value = 16.935;
      DateTime day = DateTime.Now;
      InterceptProvider provider = new InterceptProvider();
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day));
      Console.WriteLine(String.Format(provider, "{0}: {1:F}\n", "Today: ", 
                                      (DayOfWeek) DateTime.Now.DayOfWeek));
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
   }
}
// The example displays the following output:
//    Provider: InterceptProvider, Object: 10, Format String: N0
//    Provider: InterceptProvider, Object: 16.935, Format String: C2
//    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
//    10: $16.94 on 1/31/2013
//    
//    Provider: InterceptProvider, Object: Today: , Format String: <null>
//    Provider: InterceptProvider, Object: Thursday, Format String: F
//    Today: : Thursday
//    
//    Provider: InterceptProvider, Object: 2, Format String: X
//    Provider: InterceptProvider, Object: 12, Format String: <null>
//    Provider: InterceptProvider, Object: 199, Format String: <null>
//    2, 12, 199
//    
//    Provider: InterceptProvider, Object: 2, Format String: R
//    Provider: InterceptProvider, Object: 12, Format String: R
//    Provider: InterceptProvider, Object: 199, Format String: R
//    II, XII, CXCIX
Imports System.Globalization

Public Class InterceptProvider : Implements IFormatProvider, ICustomFormatter
   Public Function GetFormat(formatType As Type) As Object _
         Implements IFormatProvider.GetFormat
      If formatType Is GetType(ICustomFormatter) Then
         Return Me
      Else
         Return Nothing
      End If
   End Function
   
   Public Function Format(fmt As String, obj As Object, provider As IFormatProvider) As String _
         Implements ICustomFormatter.Format

      Dim formatString As String = If(fmt IsNot Nothing, fmt, "<null>")
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, If(obj IsNot Nothing, obj, "<null>"), formatString)

      If obj Is Nothing Then Return String.Empty
            
      ' If this is a byte and the "R" format string, format it with Roman numerals.
      If TypeOf(obj) Is Byte AndAlso formatString.ToUpper.Equals("R") Then
         Dim value As Byte = CByte(obj)
         Dim remainder As Integer
         Dim result As Integer
         Dim returnString As String = String.Empty

         ' Get the hundreds digit(s)
         result = Math.DivRem(value, 100, remainder)
         If result > 0 Then returnString = New String("C"c, result)
         value = CByte(remainder)
         ' Get the 50s digit
         result = Math.DivRem(value, 50, remainder)
         If result = 1 Then returnString += "L"
         value = CByte(remainder)
         ' Get the tens digit.
         result = Math.DivRem(value, 10, remainder)
         If result > 0 Then returnString += New String("X"c, result)
         value = CByte(remainder) 
         ' Get the fives digit.
         result = Math.DivRem(value, 5, remainder)
         If result > 0 Then returnString += "V"
         value = CByte(remainder)
         ' Add the ones digit.
         If remainder > 0 Then returnString += New String("I"c, remainder)
         
         ' Check whether we have too many X characters.
         Dim pos As Integer = returnString.IndexOf("XXXX")
         If pos >= 0 Then
            Dim xPos As Integer = returnString.IndexOf("L") 
            If xPos >= 0 And xPos = pos - 1 Then
               returnString = returnString.Replace("LXXXX", "XC")
            Else
               returnString = returnString.Replace("XXXX", "XL")   
            End If         
         End If
         ' Check whether we have too many I characters
         pos = returnString.IndexOf("IIII")
         If pos >= 0 Then
            If returnString.IndexOf("V") >= 0 Then
               returnString = returnString.Replace("VIIII", "IX")
            Else
               returnString = returnString.Replace("IIII", "IV")    
            End If
         End If
         Return returnString 
      End If   

      ' Use default for all other formatting.
      If obj Is GetType(IFormattable)
         Return CType(obj, IFormattable).ToString(fmt, CultureInfo.CurrentCulture)
      Else
         Return obj.ToString()
      End If
   End Function
End Class

Module Example
   Public Sub Main()
      Dim n As Integer = 10
      Dim value As Double = 16.935
      Dim day As DateTime = Date.Now
      Dim provider As New InterceptProvider()
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}", n, value, day))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0}: {1:F}", "Today", 
                                      CType(Date.Now.DayOfWeek, DayOfWeek)))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n", 
                                      CByte(2), CByte(12), CByte(199)))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}", 
                                      CByte(2), CByte(12), CByte(199)))
   End Sub
End Module
' The example displays the following output:
'    Provider: InterceptProvider, Object: 10, Format String: N0
'    Provider: InterceptProvider, Object: 16.935, Format String: C2
'    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
'    10: $16.94 on 1/31/2013
'    
'    Provider: InterceptProvider, Object: Today: , Format String: <null>
'    Provider: InterceptProvider, Object: Thursday, Format String: F
'    Today: : Thursday
'    
'    Provider: InterceptProvider, Object: 2, Format String: X
'    Provider: InterceptProvider, Object: 12, Format String: <null>
'    Provider: InterceptProvider, Object: 199, Format String: <null>
'    2, 12, 199
'    
'    Provider: InterceptProvider, Object: 2, Format String: R
'    Provider: InterceptProvider, Object: 12, Format String: R
'    Provider: InterceptProvider, Object: 199, Format String: R
'    II, XII, CXCIX

String.Format Q & A

¿Por qué se recomienda la interpolación de cadenas a través de llamadas al String.Format método ?

La interpolación de cadenas es:

  • Más flexible. Se puede usar en cualquier cadena sin necesidad de llamar a un método que admita el formato compuesto. De lo contrario, tendrá que llamar al Format método u otro método que admita el formato compuesto, como o Console.WriteLine StringBuilder.AppendFormat .

  • Más legible. Dado que la expresión que se va a insertar en una cadena aparece en la expresión interpolada en lugar de en una lista de argumentos, las cadenas interpoladas son mucho más fáciles de codificar y leer. Debido a su mayor legibilidad, las cadenas interpoladas pueden reemplazar no solo las llamadas a métodos de formato compuesto, sino que también se pueden usar en operaciones de concatenación de cadenas para generar código más conciso y más claro.

Una comparación de los dos ejemplos de código siguientes ilustra la superioridad de las cadenas interpoladas sobre la concatenación de cadenas y las llamadas a métodos de formato compuesto. El uso de varias operaciones de concatenación de cadenas en el ejemplo siguiente genera código detallado y difícil de leer.

  string[] names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" };
  string output = names[0] + ", " + names[1] + ", " + names[2] + ", " + 
                  names[3] + ", " + names[4] + ", " + names[5] + ", " + 
                  names[6];  

  output += "\n";  
  var date = DateTime.Now;
  output += String.Format("It is {0:t} on {0:d}. The day of the week is {1}.", 
                          date, date.DayOfWeek);
  Console.WriteLine(output);                           
  // The example displays the following output:
  //     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
  //     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Module Example
   Public Sub Main()
      Dim names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" }
      Dim output = names(0) + ", " + names(1) + ", " + names(2) + ", " + 
                   names(3) + ", " + names(4) + ", " + names(5) + ", " + 
                   names(6)  
    
      output += vbCrLf  
      Dim dat = DateTime.Now
      output += String.Format("It is {0:t} on {0:d}. The day of the week is {1}.", 
                              dat, dat.DayOfWeek)
      Console.WriteLine(output)                           
   End Sub
End Module
' The example displays the following output:
'     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
'     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Por el contrario, el uso de cadenas interpoladas en el ejemplo siguiente genera código mucho más claro y conciso que la instrucción de concatenación de cadenas y la llamada al método en Format el ejemplo anterior.

  string[] names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" };
  string output = $"{names[0]}, {names[1]}, {names[2]}, {names[3]}, {names[4]}, " + 
                  $"{names[5]}, {names[6]}";  

  var date = DateTime.Now;
  output += $"\nIt is {date:t} on {date:d}. The day of the week is {date.DayOfWeek}.";
  Console.WriteLine(output);                           
  // The example displays the following output:
  //     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
  //     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Module Example
   Public Sub Main()
      Dim names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" }
      Dim output = $"{names(0)}, {names(1)}, {names(2)}, {names(3)}, {names(4)}, " + 
                   $"{names(5)}, {names(6)}"  
    
      Dim dat = DateTime.Now
      output += $"{vbCrLf}It is {dat:t} on {dat:d}. The day of the week is {dat.DayOfWeek}." 
      Console.WriteLine(output)                           
   End Sub
End Module
' The example displays the following output:
'     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
'     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

¿Dónde puedo encontrar una lista de las cadenas de formato predefinidas que se pueden usar con elementos de formato?

Cómo controlar la alineación de las cadenas de resultado que reemplazan los elementos de formato?

La sintaxis general de un elemento de formato es:

{index[,alignment][: formatString]}

donde alignment es un entero con signo que define el ancho del campo. Si este valor es negativo, el texto del campo se alinea a la izquierda. Si es positivo, el texto se alinea a la derecha.

Cómo controlar el número de dígitos después del separador decimal?

Todas las cadenas de formato numérico estándar excepto "D" (que se usa solo con enteros), "G", "R" y "X" permiten un especificador de precisión que define el número de dígitos decimales en la cadena de resultado. En el ejemplo siguiente se usan cadenas de formato numérico estándar para controlar el número de dígitos decimales en la cadena de resultado.

object[] values = { 1603, 1794.68235, 15436.14 };
string result;
foreach (var value in values) {
   result = String.Format("{0,12:C2}   {0,12:E3}   {0,12:F4}   {0,12:N3}  {1,12:P2}\n",
                          Convert.ToDouble(value), Convert.ToDouble(value) / 10000);
   Console.WriteLine(result);
}                           
// The example displays output like the following:
//       $1,603.00     1.603E+003      1603.0000      1,603.000       16.03 %
//    
//       $1,794.68     1.795E+003      1794.6824      1,794.682       17.95 %
//    
//      $15,436.14     1.544E+004     15436.1400     15,436.140      154.36 %
Module Example
   Public Sub Main()
      Dim values() As Object = { 1603, 1794.68235, 15436.14 }
      Dim result As String
      For Each value In values
         result = String.Format("{0,12:C2}   {0,12:E3}   {0,12:F4}   {0,12:N3}  {1,12:P2}",
                                value, CDbl(value) / 10000)
         Console.WriteLine(result) 
         Console.WriteLine()
      Next                             
   End Sub
End Module
' The example displays the following output:
'       $1,603.00     1.603E+003      1603.0000      1,603.000       16.03 %
'    
'       $1,794.68     1.795E+003      1794.6824      1,794.682       17.95 %
'    
'      $15,436.14     1.544E+004     15436.1400     15,436.140      154.36 %

Si usa una cadena de formato numérico personalizado,use el especificador de formato "0" para controlar el número de dígitos decimales en la cadena de resultado, como se muestra en el ejemplo siguiente.

decimal value = 16309.5436m;
string result = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", 
                              value);
Console.WriteLine(result);
// The example displays the following output:
//        16309.54360    16,309.54    16309.544
Module Example
   Public Sub Main()
      Dim value As Decimal = 16309.5436d
      Dim result As String = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", 
                                           value)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'    16309.54360    16,309.54    16309.544

Cómo controlar el número de dígitos enteros?

De forma predeterminada, las operaciones de formato solo muestran dígitos enteros distintos de cero. Si va a dar formato a enteros, puede usar un especificador de precisión con las cadenas de formato estándar "D" y "X" para controlar el número de dígitos.

int value = 1326;
string result = String.Format("{0,10:D6} {0,10:X8}", value);
Console.WriteLine(result);
// The example displays the following output:
//     001326   0000052E
Module Example
   Public Sub Main()
      Dim value As Integer = 1326
      Dim result As String = String.Format("{0,10:D6} {0,10:X8}", value)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'       001326   0000052E

Puede agregar un número entero o de punto flotante con ceros iniciales para generar una cadena de resultado con un número especificado de dígitos enteros mediante el especificador de formato numérico personalizado "0", como se muestra en el ejemplo siguiente.

int value = 16342;
string result = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", 
                              value);
Console.WriteLine(result);
// The example displays the following output:
//           00016342       00016342.000    0,000,016,342.0
Module Example
   Public Sub Main()
      Dim value As Integer = 16342
      Dim result As String = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", 
                                           value)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'           00016342       00016342.000    0,000,016,342.0

¿Cuántos elementos puedo incluir en la lista de formatos?

No hay ningún límite práctico. El segundo parámetro del método se etiqueta con el atributo , que permite incluir una lista delimitada o una matriz de objetos Format(IFormatProvider, String, Object[]) ParamArrayAttribute como lista de formato.

Cómo incluir llaves literales ("{" y "}") en la cadena de resultado?

Por ejemplo, ¿cómo se impide que la siguiente llamada al método produce una FormatException excepción?

result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
                       nOpen, nClose);
result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
                       nOpen, nClose)

Una única llave de apertura o cierre siempre se interpreta como el principio o el final de un elemento de formato. Para que se interprete literalmente, debe ser de escape. Para escapar una llave, agregue otra llave ("{{" y "}}" en lugar de "{" y "}"), como en la siguiente llamada al método:

string result;
int nOpen = 1;
int nClose = 2;
result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                       nOpen, nClose);
Console.WriteLine(result);
result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                       nOpen, nClose)

Sin embargo, incluso las llaves de escape se interpretan mal fácilmente. Se recomienda incluir llaves en la lista de formato y usar elementos de formato para insertarlos en la cadena de resultado, como se muestra en el ejemplo siguiente.

string result;
int nOpen = 1;
int nClose = 2;
result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}");
Console.WriteLine(result);
result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}")

¿Por qué mi llamada al método String.Format produce una excepción FormatException?

La causa más común de la excepción es que el índice de un elemento de formato no se corresponde con un objeto de la lista de formato. Normalmente, esto indica que ha numerado erróneamente los índices de los elementos de formato o que ha olvidado incluir un objeto en la lista de formato. Al intentar incluir un carácter de llave izquierda o derecha sin caracteres, también se produce una FormatException excepción . En ocasiones, la excepción es el resultado de un error tipográfico; Por ejemplo, un error típico es escribir erróneamente "[" (el corchete izquierdo) en lugar de "{" (la llave izquierda).

Si el método Format(System.IFormatProvider,System.String,System.Object[]) admite matrices de parámetros, ¿por qué el código produce una excepción cuando se usa una matriz?

Por ejemplo, el código siguiente produce una FormatException excepción:

Random rnd = new Random();
int[]  numbers = new int[4];
int total = 0;
for (int ctr = 0; ctr <= 2; ctr++) {
   int number = rnd.Next(1001);
   numbers[ctr] = number;
   total += number;
}   
numbers[3] = total;
Console.WriteLine("{0} + {1} + {2} = {3}", numbers);
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      Dim numbers(3) As Integer
      Dim total As Integer = 0
      For ctr = 0 To 2
         Dim number As Integer = rnd.Next(1001)
         numbers(ctr) = number
         total += number
      Next
      numbers(3) = total
      Console.WriteLine("{0} + {1} + {2} = {3}", numbers)   
   End Sub
End Module

Se trata de un problema de resolución de sobrecargas del compilador. Dado que el compilador no puede convertir una matriz de enteros en una matriz de objetos, trata la matriz de enteros como un argumento único, por lo que llama al Format(String, Object) método . La excepción se produce porque hay cuatro elementos de formato, pero solo un elemento en la lista de formato.

Dado que ni Visual Basic ni C# pueden convertir una matriz de enteros en una matriz de objetos, tiene que realizar la conversión usted mismo antes de llamar al Format(String, Object[]) método . En el siguiente ejemplo se proporciona una implementación.

Random rnd = new Random();
int[]  numbers = new int[4];
int total = 0;
for (int ctr = 0; ctr <= 2; ctr++) {
   int number = rnd.Next(1001);
   numbers[ctr] = number;
   total += number;
}   
numbers[3] = total;
object[] values = new object[numbers.Length];
numbers.CopyTo(values, 0);
Console.WriteLine("{0} + {1} + {2} = {3}", values);
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      Dim numbers(3) As Integer
      Dim total As Integer = 0
      For ctr = 0 To 2
         Dim number As Integer = rnd.Next(1001)
         numbers(ctr) = number
         total += number
      Next
      numbers(3) = total
      Dim values(numbers.Length - 1) As Object
      numbers.CopyTo(values, 0) 
      Console.WriteLine("{0} + {1} + {2} = {3}", values)   
   End Sub
End Module

Format(String, Object)

Reemplaza uno o más elementos de formato de una cadena por la representación de cadena de un objeto especificado.

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0);
public static string Format (string format, object arg0);
public static string Format (string format, object? arg0);
static member Format : string * obj -> string
Public Shared Function Format (format As String, arg0 As Object) As String

Parámetros

format
String

Cadena de formato compuesto.

arg0
Object

Objeto al que se va a aplicar formato.

Devoluciones

String

Copia de format en la que los elementos de formato se ha reemplazado por la representación de cadena de arg0.

Excepciones

format es null.

El elemento de formato de format no es válido.

O bien

El índice de un elemento de formato no es cero.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir el valor de una expresión en su representación de cadena e insertar esa representación en una cadena.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Ejemplo: Aplicar formato a un solo argumento

En el ejemplo siguiente se usa el método para insertar la edad de un Format(String, Object) individuo en medio de una cadena.

using namespace System;

void main()
{
   DateTime birthdate = DateTime(1993, 7, 28);
   array<DateTime>^ dates = gcnew array<DateTime> { DateTime(1993, 8, 16), 
                                                    DateTime(1994, 7, 28), 
                                                    DateTime(2000, 10, 16), 
                                                    DateTime(2003, 7, 27), 
                                                    DateTime(2007, 5, 27) };

   for each (DateTime dateValue in dates)
   {
      TimeSpan interval = dateValue - birthdate;
      // Get the approximate number of years, without accounting for leap years.
      int years = ((int)interval.TotalDays) / 365;
      // See if adding the number of years exceeds dateValue.
      String^ output;
      if (birthdate.AddYears(years) <= dateValue) {
         output = String::Format("You are now {0} years old.", years);
         Console::WriteLine(output);
      }   
      else {
         output = String::Format("You are now {0} years old.", years - 1);
         Console::WriteLine(output);
      }      
   }
}
// The example displays the following output:
//       You are now 0 years old.
//       You are now 1 years old.
//       You are now 7 years old.
//       You are now 9 years old.
//       You are now 13 years old.
DateTime birthdate = new DateTime(1993, 7, 28);
DateTime[] dates = { new DateTime(1993, 8, 16), 
                     new DateTime(1994, 7, 28), 
                     new DateTime(2000, 10, 16), 
                     new DateTime(2003, 7, 27), 
                     new DateTime(2007, 5, 27) };

foreach (DateTime dateValue in dates)
{
   TimeSpan interval = dateValue - birthdate;
   // Get the approximate number of years, without accounting for leap years.
   int years = ((int) interval.TotalDays) / 365;
   // See if adding the number of years exceeds dateValue.
   string output;
   if (birthdate.AddYears(years) <= dateValue) {
      output = String.Format("You are now {0} years old.", years);
      Console.WriteLine(output);
   }   
   else {
      output = String.Format("You are now {0} years old.", years - 1);
      Console.WriteLine(output);
   }      
}
// The example displays the following output:
//       You are now 0 years old.
//       You are now 1 years old.
//       You are now 7 years old.
//       You are now 9 years old.
//       You are now 13 years old.
Module Example
   Public Sub Main()
      Dim birthdate As Date = #7/28/1993#
      Dim dates() As Date = { #9/16/1993#, #7/28/1994#, #10/16/2000#, _
                              #7/27/2003#, #5/27/2007# }
      For Each dateValue As Date In dates
         Dim interval As TimeSpan = dateValue - birthdate
         ' Get the approximate number of years, without accounting for leap years.
         Dim years As Integer = CInt(interval.TotalDays) \ 365
         ' See if adding the number of years exceeds dateValue.
         Dim output As String
         If birthdate.AddYears(years) <= dateValue Then
            output = String.Format("You are now {0} years old.", years)
            Console.WriteLine(output)
         Else
            output = String.Format("You are now {0} years old.", years - 1)
            Console.WriteLine(output)   
         End If
      Next
   End Sub
End Module
' The example displays the following output:
'       You are now 0 years old.
'       You are now 1 years old.
'       You are now 7 years old.
'       You are now 9 years old.
'       You are now 13 years old.

Consulte también

Se aplica a

Format(String, Object[])

Reemplaza el elemento de formato de una cadena especificada por la representación de cadena de un objeto correspondiente de una matriz especificada.

public:
 static System::String ^ Format(System::String ^ format, ... cli::array <System::Object ^> ^ args);
public static string Format (string format, params object[] args);
public static string Format (string format, params object?[] args);
static member Format : string * obj[] -> string
Public Shared Function Format (format As String, ParamArray args As Object()) As String

Parámetros

format
String

Cadena de formato compuesto.

args
Object[]

Matriz de objetos que contiene cero o más objetos a los que se va a aplicar formato.

Devoluciones

String

Copia de format en la que los elementos de formato se han reemplazado por la representación de cadena de los objetos correspondientes de args.

Excepciones

format o args es null.

format no es válido.

O bien

El índice de un elemento de formato es menor que cero, o mayor o igual que la longitud de la matriz args.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir el valor de cuatro o más expresiones en sus representaciones de cadena e insertar esas representaciones en una cadena. Puesto que el parámetro está marcado con el atributo , puede pasar los objetos al método como args System.ParamArrayAttribute argumentos individuales o como una Object matriz.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Ejemplo: Dar formato a más de tres argumentos

En este ejemplo se crea una cadena que contiene datos sobre la temperatura alta y baja en una fecha determinada. La cadena de formato compuesto tiene cinco elementos de formato en el ejemplo de C# y seis en el Visual Basic ejemplo. Dos de los elementos de formato definen el ancho de la representación de cadena de su valor correspondiente y el primer elemento de formato también incluye una cadena de formato de fecha y hora estándar.

using namespace System;

void main()
{
   DateTime date1 = DateTime(2009, 7, 1);
   TimeSpan hiTime = TimeSpan(14, 17, 32);
   Decimal hiTemp = (Decimal) 62.1; 
   TimeSpan loTime = TimeSpan(3, 16, 10);
   Decimal loTemp = (Decimal)54.8; 

   String^ result1 = String::Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                    date1, hiTime, hiTemp, loTime, loTemp);
   Console::WriteLine(result1);
   Console::WriteLine();
           
   String^ result2 = String::Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                    gcnew array<Object^> { date1, hiTime, hiTemp, loTime, loTemp });
   Console::WriteLine(result2);
}
// The example displays the following output:
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
DateTime date1 = new DateTime(2009, 7, 1);
TimeSpan hiTime = new TimeSpan(14, 17, 32);
decimal hiTemp = 62.1m; 
TimeSpan loTime = new TimeSpan(3, 16, 10);
decimal loTemp = 54.8m; 

string result1 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                               date1, hiTime, hiTemp, loTime, loTemp);
Console.WriteLine(result1);
Console.WriteLine();
     
string result2 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                               new object[] { date1, hiTime, hiTemp, loTime, loTemp });
Console.WriteLine(result2);
// The example displays output like the following:
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
Module Example
   Public Sub Main()
      Dim date1 As Date = #7/1/2009#
      Dim hiTime As New TimeSpan(14, 17, 32)
      Dim hiTemp As Decimal = 62.1d 
      Dim loTime As New TimeSpan(3, 16, 10)
      Dim loTemp As Decimal = 54.8d 

      Dim result1 As String = String.Format("Temperature on {0:d}:{5}{1,11}: {2} degrees (hi){5}{3,11}: {4} degrees (lo)", _
                                           date1, hiTime, hiTemp, loTime, loTemp, vbCrLf)
      Console.WriteLine(result1)
      Console.WriteLine()
           
      Dim result2 As String = String.Format("Temperature on {0:d}:{5}{1,11}: {2} degrees (hi){5}{3,11}: {4} degrees (lo)", _
                                            New Object() { date1, hiTime, hiTemp, loTime, loTemp, vbCrLf })
      Console.WriteLine(result2)                                            
   End Sub
End Module
' The example displays the following output:
'       Temperature on 7/1/2009:
'          14:17:32: 62.1 degrees (hi)
'          03:16:10: 54.8 degrees (lo)
'
'       Temperature on 7/1/2009:
'          14:17:32: 62.1 degrees (hi)
'          03:16:10: 54.8 degrees (lo)

También puede pasar los objetos a los que se va a dar formato como una matriz en lugar de como una lista de argumentos.

using namespace System;

ref class CityInfo
{
public:
   CityInfo(String^ name, int population, Decimal area, int year)
   {
      this->Name = name;
      this->Population = population;
      this->Area = area;
      this->Year = year;
   }
   
   String^ Name; 
   int Population;
   Decimal Area;
   int Year;
};

ref class Example
{
public:
   static void ShowPopulationData(CityInfo^ city)
   {
      array<Object^>^ args = gcnew array<Object^> { city->Name, city->Year, city->Population, city->Area };
      String^ result = String::Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", 
                                    args);
      Console::WriteLine(result); 
   }
};

void main()
{
   CityInfo^ nyc2010 = gcnew CityInfo("New York", 8175133, (Decimal) 302.64, 2010);
   Example::ShowPopulationData(nyc2010);
   CityInfo^ sea2010 = gcnew CityInfo("Seattle", 608660, (Decimal) 83.94, 2010);      
   Example::ShowPopulationData(sea2010); 
}
// The example displays the following output:
//       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
//       Seattle in 2010: Population 608,660, Area 83.9 sq. feet
using System;

public class CityInfo
{
   public CityInfo(String name, int population, Decimal area, int year)
   {
      this.Name = name;
      this.Population = population;
      this.Area = area;
      this.Year = year;
   }
   
   public readonly String Name; 
   public readonly int Population;
   public readonly Decimal Area;
   public readonly int Year;
}

public class Example
{
   public static void Main()
   {
      CityInfo nyc2010 = new CityInfo("New York", 8175133, 302.64m, 2010);
      ShowPopulationData(nyc2010);
      CityInfo sea2010 = new CityInfo("Seattle", 608660, 83.94m, 2010);      
      ShowPopulationData(sea2010); 
   }

   private static void ShowPopulationData(CityInfo city)
   {
      object[] args = { city.Name, city.Year, city.Population, city.Area };
      String result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", 
                                    args);
      Console.WriteLine(result); 
   }
}
// The example displays the following output:
//       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
//       Seattle in 2010: Population 608,660, Area 83.9 sq. feet
Public Class CityInfo
   Public Sub New(name As String, population As Integer, area As Decimal, year As Integer)
      Me.Name = name
      Me.Population = population
      Me.Area = area
      Me.Year = year
   End Sub
   
   Public ReadOnly Name As String
   Public ReadOnly Population As Integer
   Public ReadOnly Area As Decimal
   Public ReadOnly Year As Integer
End Class

Module Example
   Public Sub Main()
      Dim nyc2010 As New CityInfo("New York", 8175133, 302.64d, 2010)
      ShowPopulationData(nyc2010)
      Dim sea2010 As New CityInfo("Seattle", 608660, 83.94d, 2010)      
      ShowPopulationData(sea2010) 
   End Sub
   
   Private Sub ShowPopulationData(city As CityInfo)
      Dim args() As Object = { city.Name, city.Year, city.Population, city.Area }
      Dim result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", args)
      Console.WriteLine(result) 
   End Sub
End Module
' The example displays the following output:
'       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
'       Seattle in 2010: Population 608,660, Area 83.9 sq. feet

Consulte también

Se aplica a

Format(IFormatProvider, String, Object)

Sustituye el elemento o elementos de formato en una cadena específica con la representación de cadena del objeto correspondiente. Un parámetro proporciona información de formato específica de la referencia cultural.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0);
public static string Format (IFormatProvider provider, string format, object arg0);
public static string Format (IFormatProvider? provider, string format, object? arg0);
static member Format : IFormatProvider * string * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object) As String

Parámetros

provider
IFormatProvider

Objeto que proporciona información de formato específica de la referencia cultural.

format
String

Cadena de formato compuesto.

arg0
Object

Objeto al que se va a aplicar formato.

Devoluciones

String

Una copia de format en la que el elemento o elementos de formato se han sustituido con la representación de cadena de arg0.

Excepciones

format es null.

format no es válido.

O bien

El índice de un elemento de formato no es cero.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir el valor de una expresión en su representación de cadena e insertar esa representación en una cadena. Al realizar la conversión, el método usa formatos que tienen en cuenta la referencia cultural o un formateador personalizado. El método convierte en su representación de cadena llamando a su método arg0 ToString(IFormatProvider) o, si el elemento de formato correspondiente del objeto incluye una cadena de formato, llamando a su método ToString(String,IFormatProvider). Si estos métodos no existen, llama al método ToString sin parámetros del objeto.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un objeto que proporcione un formato con referencia cultural o personalizado, y una cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Se aplica a

Format(IFormatProvider, String, Object[])

Reemplaza los elementos de formato de una cadena por las representaciones de cadena de los objetos correspondientes en una matriz especificada. Un parámetro proporciona información de formato específica de la referencia cultural.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, ... cli::array <System::Object ^> ^ args);
public static string Format (IFormatProvider provider, string format, params object[] args);
public static string Format (IFormatProvider? provider, string format, params object?[] args);
static member Format : IFormatProvider * string * obj[] -> string
Public Shared Function Format (provider As IFormatProvider, format As String, ParamArray args As Object()) As String

Parámetros

provider
IFormatProvider

Objeto que proporciona información de formato específica de la referencia cultural.

format
String

Cadena de formato compuesto.

args
Object[]

Matriz de objetos que contiene cero o más objetos a los que se va a aplicar formato.

Devoluciones

String

Copia de format en la que los elementos de formato se han reemplazado por la representación de cadena de los objetos correspondientes de args.

Excepciones

format o args es null.

format no es válido.

O bien

El índice de un elemento de formato es menor que cero, o mayor o igual que la longitud de la matriz args.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir cuatro o más expresiones en sus representaciones de cadena e insertar esas representaciones en una cadena. Al realizar la conversión, el método usa formatos que tienen en cuenta la referencia cultural o un formateador personalizado. El método convierte cada argumento en su representación de cadena llamando a su método Object ToString(IFormatProvider) o, si el elemento de formato correspondiente del objeto incluye una cadena de formato, llamando a su método ToString(String,IFormatProvider). Si estos métodos no existen, llama al método ToString sin parámetros del objeto.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un objeto que proporcione un formato con referencia cultural o personalizado, y una cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Ejemplo: Formatos que distinguen entre culturas

En este ejemplo se usa el método para mostrar la representación de cadena de algunos valores de fecha y hora y valores Format(IFormatProvider, String, Object[]) numéricos mediante varias referencia culturales diferentes.

string[] cultureNames = { "en-US", "fr-FR", "de-DE", "es-ES" };

DateTime dateToDisplay = new DateTime(2009, 9, 1, 18, 32, 0);
double value = 9164.32;

Console.WriteLine("Culture     Date                                Value\n");
foreach (string cultureName in cultureNames)
{
   System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(cultureName);
   string output = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", 
                                 culture.Name, dateToDisplay, value);
   Console.WriteLine(output);
}    
// The example displays the following output:
//    Culture     Date                                Value
//    
//    en-US       Tuesday, September 01, 2009         9,164.32
//    fr-FR       mardi 1 septembre 2009              9 164,32
//    de-DE       Dienstag, 1. September 2009         9.164,32
//    es-ES       martes, 01 de septiembre de 2009    9.164,32
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "de-DE", "es-ES" }
      
      Dim dateToDisplay As Date = #9/1/2009 6:32PM#
      Dim value As Double = 9164.32

      Console.WriteLine("Culture     Date                                Value")
      Console.WriteLine()      
      For Each cultureName As String In cultureNames
         Dim culture As New CultureInfo(cultureName)
         Dim output As String = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", _
                                              culture.Name, dateToDisplay, value)
         Console.WriteLine(output)
      Next    
   End Sub
End Module
' The example displays the following output:
'       Culture     Date                                Value
'       
'       en-US       Tuesday, September 01, 2009         9,164.32
'       fr-FR       mardi 1 septembre 2009              9 164,32
'       de-DE       Dienstag, 1. September 2009         9.164,32
'       es-ES       martes, 01 de septiembre de 2009    9.164,32

Consulte también

Se aplica a

Format(String, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de dos objetos especificados.

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1);
public static string Format (string format, object arg0, object arg1);
public static string Format (string format, object? arg0, object? arg1);
static member Format : string * obj * obj -> string
Public Shared Function Format (format As String, arg0 As Object, arg1 As Object) As String

Parámetros

format
String

Cadena de formato compuesto.

arg0
Object

Primer objeto al que se va a dar formato.

arg1
Object

Segundo objeto al que se va a dar formato.

Devoluciones

String

Copia de format en la que los elementos de formato se ha reemplazado por las representaciones de cadena de arg0 y arg1.

Excepciones

format es null.

format no es válido.

O bien

El índice de un elemento de formato no es cero o uno.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir el valor de dos expresiones en sus representaciones de cadena e insertar esas representaciones en una cadena.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Ejemplo: Dar formato a dos argumentos

En este ejemplo se usa Format(String, Object, Object) el método para mostrar los datos de tiempo y temperatura almacenados en un objeto Dictionary<TKey,TValue> genérico. Tenga en cuenta que la cadena de formato tiene tres elementos de formato, aunque solo hay dos objetos para dar formato. Esto se debe a que dos elementos de formato usan el primer objeto de la lista (un valor de fecha y hora): el primer elemento de formato muestra la hora y el segundo muestra la fecha.

using namespace System;
using namespace System::Collections::Generic;

void main()
{
   Dictionary<DateTime, Double>^ temperatureInfo = gcnew Dictionary<DateTime, Double>(); 
   temperatureInfo->Add(DateTime(2010, 6, 1, 14, 0, 0), 87.46);
   temperatureInfo->Add(DateTime(2010, 12, 1, 10, 0, 0), 36.81);
      
   Console::WriteLine("Temperature Information:\n");
   String^ output;   
   for each (KeyValuePair<DateTime, Double>^ item in temperatureInfo)
   {
      output = String::Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}�F", 
                              item->Key, item->Value);
      Console::WriteLine(output);
   }
}
// The example displays the following output:
//       Temperature Information:
//       
//       Temperature at  2:00 PM on  6/1/2010:  87.5�F
//       Temperature at 10:00 AM on 12/1/2010:  36.8�F
Dictionary<DateTime, Double> temperatureInfo = new Dictionary<DateTime, Double>(); 
temperatureInfo.Add(new DateTime(2010, 6, 1, 14, 0, 0), 87.46);
temperatureInfo.Add(new DateTime(2010, 12, 1, 10, 0, 0), 36.81);

Console.WriteLine("Temperature Information:\n");
string output;   
foreach (var item in temperatureInfo)
{
   output = String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", 
                          item.Key, item.Value);
   Console.WriteLine(output);
}
// The example displays output like the following:
//       Temperature Information:
//       
//       Temperature at  2:00 PM on  6/1/2010:  87.5°F
//       Temperature at 10:00 AM on 12/1/2010:  36.8°F
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim temperatureInfo As New Dictionary(Of Date, Double) 
      temperatureInfo.Add(#6/1/2010 2:00PM#, 87.46)
      temperatureInfo.Add(#12/1/2010 10:00AM#, 36.81)
      
      Console.WriteLine("Temperature Information:")
      Console.WriteLine()
      Dim output As String   
      For Each item In temperatureInfo
         output = String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", _
                                item.Key, item.Value)
         Console.WriteLine(output)
      Next
   End Sub
End Module
' The example displays the following output:
'       Temperature Information:
'       
'       Temperature at  2:00 PM on  6/1/2010:  87.5°F
'       Temperature at 10:00 AM on 12/1/2010:  36.8°F

Consulte también

Se aplica a

Format(IFormatProvider, String, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de dos objetos especificados. Un parámetro proporciona información de formato específica de la referencia cultural.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0, System::Object ^ arg1);
public static string Format (IFormatProvider provider, string format, object arg0, object arg1);
public static string Format (IFormatProvider? provider, string format, object? arg0, object? arg1);
static member Format : IFormatProvider * string * obj * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object, arg1 As Object) As String

Parámetros

provider
IFormatProvider

Objeto que proporciona información de formato específica de la referencia cultural.

format
String

Cadena de formato compuesto.

arg0
Object

Primer objeto al que se va a dar formato.

arg1
Object

Segundo objeto al que se va a dar formato.

Devoluciones

String

Copia de format en la que los elementos de formato se ha reemplazado por las representaciones de cadena de arg0 y arg1.

Excepciones

format es null.

format no es válido.

O bien

El índice de un elemento de formato no es cero o uno.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir dos expresiones en sus representaciones de cadena e insertar esas representaciones en una cadena. Al realizar la conversión, el método usa formatos que tienen en cuenta la referencia cultural o un formateador personalizado. El método convierte cada argumento en su representación de cadena llamando a su método Object ToString(IFormatProvider) o, si el elemento de formato correspondiente del objeto incluye una cadena de formato, llamando a su método ToString(String,IFormatProvider). Si estos métodos no existen, llama al método ToString sin parámetros del objeto.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un objeto que proporcione un formato con referencia cultural o personalizado, y una cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Se aplica a

Format(String, Object, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de tres objetos especificados.

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1, System::Object ^ arg2);
public static string Format (string format, object arg0, object arg1, object arg2);
public static string Format (string format, object? arg0, object? arg1, object? arg2);
static member Format : string * obj * obj * obj -> string
Public Shared Function Format (format As String, arg0 As Object, arg1 As Object, arg2 As Object) As String

Parámetros

format
String

Cadena de formato compuesto.

arg0
Object

Primer objeto al que se va a dar formato.

arg1
Object

Segundo objeto al que se va a dar formato.

arg2
Object

Tercer objeto al que se va a dar formato.

Devoluciones

String

Copia de format en la que los elementos de formato se ha reemplazado por las representaciones de cadena de arg0, arg1 y arg2.

Excepciones

format es null.

format no es válido.

O bien

El índice de un elemento de formato es menor que cero o mayor que dos.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir el valor de tres expresiones en sus representaciones de cadena e insertar esas representaciones en una cadena.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Ejemplo: Dar formato a tres argumentos

En este ejemplo se usa el método para crear una cadena que ilustra Format(String, Object, Object, Object) el resultado de una operación And booleana con dos valores enteros. Tenga en cuenta que la cadena de formato incluye seis elementos de formato, pero el método solo tiene tres elementos en su lista de parámetros, porque cada elemento tiene formato de dos maneras diferentes.

using namespace System;

void main()
{
   String^ formatString = "    {0,10} ({0,8:X8})\n" + 
                           "And {1,10} ({1,8:X8})\n" + 
                           "  = {2,10} ({2,8:X8})";
   int value1 = 16932;
   int value2 = 15421;
   String^ result = String::Format(formatString, 
                                   value1, value2, value1 & value2);
   Console::WriteLine(result);
}
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)
string formatString = "    {0,10} ({0,8:X8})\n" + 
                      "And {1,10} ({1,8:X8})\n" + 
                      "  = {2,10} ({2,8:X8})";
int value1 = 16932;
int value2 = 15421;
string result = String.Format(formatString, 
                              value1, value2, value1 & value2);
Console.WriteLine(result);
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)
Public Module Example
   Public Sub Main()
      Dim formatString As String = "    {0,10} ({0,8:X8})" + vbCrLf +  _
                                   "And {1,10} ({1,8:X8})" + vbCrLf + _
                                   "  = {2,10} ({2,8:X8})"
      Dim value1 As Integer = 16932
      Dim value2 As Integer = 15421
      Dim result As String = String.Format(formatString, _
                                           value1, value2, value1 And value2)
      Console.WriteLine(result)                          
   End Sub
End Module
' The example displays the following output:
'                16932 (00004224)
'       And      15421 (00003C3D)
'         =         36 (00000024)

Consulte también

Se aplica a

Format(IFormatProvider, String, Object, Object, Object)

Reemplaza los elementos de formato de una cadena por la representación de cadena de tres objetos especificados. Un parámetro proporciona información de formato específica de la referencia cultural.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0, System::Object ^ arg1, System::Object ^ arg2);
public static string Format (IFormatProvider provider, string format, object arg0, object arg1, object arg2);
public static string Format (IFormatProvider? provider, string format, object? arg0, object? arg1, object? arg2);
static member Format : IFormatProvider * string * obj * obj * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object, arg1 As Object, arg2 As Object) As String

Parámetros

provider
IFormatProvider

Objeto que proporciona información de formato específica de la referencia cultural.

format
String

Cadena de formato compuesto.

arg0
Object

Primer objeto al que se va a dar formato.

arg1
Object

Segundo objeto al que se va a dar formato.

arg2
Object

Tercer objeto al que se va a dar formato.

Devoluciones

String

Copia de format en la que los elementos de formato se ha reemplazado por las representaciones de cadena de arg0, arg1 y arg2.

Excepciones

format es null.

format no es válido.

O bien

El índice de un elemento de formato es menor que cero o mayor que dos.

Comentarios

Importante

En lugar de llamar al método String.Format o usar cadenas de formato compuesto, se pueden usar cadenas interpoladas si el lenguaje las admite. Una cadena interpolada es una cadena que contiene expresiones interpoladas. Cada expresión interpolada se resuelve con el valor de la expresión y se incluye en la cadena de resultado cuando se asigna la cadena. Para obtener más información, vea Interpolación de cadenas (Referencia de C#) y Cadenas interpoladas (referencia de Visual Basic).

Este método usa la característica de formato compuesto para convertir tres expresiones en sus representaciones de cadena e insertar esas representaciones en una cadena. Al realizar la conversión, el método usa formatos que tienen en cuenta la referencia cultural o un formateador personalizado. El método convierte cada argumento en su representación de cadena llamando a su método Object ToString(IFormatProvider) o, si el elemento de formato correspondiente del objeto incluye una cadena de formato, llamando a su método ToString(String,IFormatProvider). Si estos métodos no existen, llama al método ToString sin parámetros del objeto.

Pero al llamar al método String.Format, no es necesario centrarse en la sobrecarga concreta que se quiere llamar. En su lugar, se puede llamar al método con un objeto que proporcione un formato con referencia cultural o personalizado, y una cadena de formato compuesto que incluya uno o varios elementos de formato. A cada elemento de formato se le asigna un índice numérico; el primer índice comienza en 0. Además de la cadena inicial, la llamada al método debe tener tantos argumentos adicionales como valores de índice. Por ejemplo, una cadena cuyos elementos de formato tienen los índices 0 y 1 debe tener dos argumentos; una con los índices de 0 a 5 debe tener seis argumentos. Después, el compilador del lenguaje resolverá la llamada de método en una sobrecarga concreta del método String.Format.

Para obtener información más detallada sobre el uso del método String.Format, vea Introducción al método String.Format y ¿Qué método se debe llamar?.

Se aplica a