Aplicar formato a datos numéricos para una referencia cultural específica

La claseNumberFormatInfo define cómo se aplica formato a la moneda, los separadores decimales y otros símbolos numéricos basados en la referencia cultural, y también cómo se muestran. Por ejemplo, al número decimal 10000,50 se le aplica el formato 10,000.50 para la referencia cultural "en-US" y 10.000,50 para la referencia cultural "de-DE".

Se puede crear una instancia de NumberFormatInfo para una referencia cultural específica o para la referencia cultural invariable, pero no para una referencia cultural neutra. Una referencia cultural neutra no proporciona suficiente información como para mostrar el formato numérico correcto. Se producirá una excepción si se intenta crear una instancia de NumberFormatInfo utilizando una referencia cultural neutra.

En el ejemplo de código siguiente se presenta un número entero utilizando el formato de moneda estándar ("c") NumberFormatInfo para la referencia cultural CurrentCulture especificada.

Imports System
Imports System.Globalization

Public Class TestClass

   Public Shared Sub Main()
      Dim i As Integer = 100
      
      ' Creates a CultureInfo for English in Belize.
      Dim bz As New CultureInfo("en-BZ")
      ' Displays i formatted as currency for the bz.
      Console.WriteLine(i.ToString("c", bz))
      
      ' Creates a CultureInfo for English in the U.S.
      Dim us As New CultureInfo("en-US")
      ' Displays i formatted as currency for us.
      Console.WriteLine(i.ToString("c", us))
      
      ' Creates a CultureInfo for Danish in Denmark.
      Dim dk As New CultureInfo("da-DK")
      ' Displays i formatted as currency for dk.
      Console.WriteLine(i.ToString("c", dk))
   End Sub
End Class
using System;
using System.Globalization;

public class TestClass
{
   public static void Main()
   {
      int i = 100;
      
      // Creates a CultureInfo for English in Belize.
      CultureInfo bz = new CultureInfo("en-BZ");
      // Displays i formatted as currency for the bz.
      Console.WriteLine(i.ToString("c", bz));
      
      // Creates a CultureInfo for English in the U.S.
      CultureInfo us = new CultureInfo("en-US");
      // Display i formatted as currency for us.
      Console.WriteLine(i.ToString("c", us));
      
      // Creates a CultureInfo for Danish in Denmark.
      CultureInfo dk = new CultureInfo("da-DK");
      // Displays i formatted as currency for dk.
      Console.WriteLine(i.ToString("c", dk));
   }
}

Este código genera el resultado siguiente:

BZ$100.00
$100.00
kr100,00

Aplicar formato de moneda para los países de la zona del euro

Las clases CultureInfo y RegionInfo incluyen información acerca de la moneda. Sólo se especifica una moneda por cada referencia cultural. El euro es la moneda oficial de Bélgica, Alemania, España, Francia, Irlanda, Italia, Luxemburgo, Países Bajos, Austria, Portugal, Finlandia y Grecia. El 1 de enero de 2002, esos países empezaron a utilizar billetes de banco y monedas en euros. Por lo tanto, .NET Framework y Microsoft Windows XP establecen el euro como símbolo de moneda predeterminado para esos doces países que utilizan el euro como moneda oficial. Las versiones anteriores de Windows todavía establecerán la moneda local como símbolo de moneda predeterminado para esos países.

Debe ser consciente de las diferencias de los sistemas operativos con respecto a los símbolos de moneda predeterminados. En Windows, los usuarios pueden reemplazar algunos de los valores asociados a la referencia cultural predeterminada del sistema, en Configuración regional y Opciones de idioma del Panel de control. Por ejemplo, el usuario puede decidir mostrar la moneda utilizando un símbolo diferente al predeterminado para la referencia cultural. Windows Forms y las aplicaciones de consola utilizan el símbolo de moneda predeterminado especificado en el sistema del usuario. El usuario de un país o región que adopte el euro, disponga de una versión anterior de Windows y no haya actualizado la configuración de moneda al euro a través de Configuración regional del Panel de control, tendrá una configuración de moneda predeterminada incorrecta. Las aplicaciones de ASP.NET y las aplicaciones de servicios Web XML creadas en ASP.NET se ejecutan como servicios de sistema, no para usuarios específicos. Por lo tanto, el resultado predeterminado que devuelven puede cambiar con respecto a los devueltos por Windows Forms y las aplicaciones de consola.

Se recomienda escribir código que utilice la configuración de moneda predeterminada de .NET Framework para una referencia cultural, con el fin de proteger la aplicación de las diferencias de los sistemas operativos y asegurar el uso de un formato de moneda coherente. Cree CultureInfo mediante una de las sobrecargas del constructor que acepte un parámetro useUserOverride y establezca a false el valor de este parámetro. Esto hará que la configuración de moneda predeterminada del sistema del usuario sea reemplazada por la configuración predeterminada correcta de .NET Framework.

En el siguiente código de servicios Web XML, el método del servicio Web XML UserLocalSetting establece el valor de CurrentCulture como "fr-FR" y devuelve un número entero con formato de moneda. Debido a las diferencias de los sistemas operativos, no puede estar seguro de si se utilizará el símbolo del euro o el símbolo "F". El método de servidor Web XML OverrideUserSetting establece CurrentCulture como "fr-FR" mediante el constructor CultureInfo que acepta un parámetro useUserOverride y lo establece como false. Devuelve un número entero con formato de moneda. Se garantiza que se va a utilizar el símbolo del euro porque es el predeterminado de .NET Framework.

<%@ WebService Language="VB" Class="userOverrideSample" %>

Imports System
Imports System.Web.Services
Imports System.Globalization
Imports System.Threading

Public Class userOverrideSample

   <WebMethod> _
   Public Function UserLocalSetting() As String
      Dim i As Integer = 100

      ' Sets the CurrentCulture to French in France.
      Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
      ' Displays i formatted as currency for the CurrentCulture.
      ' Due to operating system differences, you cannot be sure what currency
      ' symbol will be used.
      return (i.ToString("c"))
   End Function

   <WebMethod> _
   Public Function OverrideUserSetting() As String
      Dim i As Integer = 100

      ' Sets the CurrentCulture to French in France.
      ' Uses the CultureInfo constructor that takes a 
      ' useUserOverride parameter.
      ' Sets the useUserOverride value to false.
      Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR", _
         false)
      ' Displays i formatted as currency for the CurrentCulture.
      ' This will override any user settings and display the euro symbol.
      return (i.ToString("c"))
   End Function 
End Class
<%@ WebService Language="c#" Class="userOverrideSample" %>

using System;
using System.Web.Services;
using System.Globalization;
using System.Threading;

public class userOverrideSample
{
   [WebMethod]
   public String UserLocalSetting()
   {
      int i = 100;

      // Sets the CurrentCulture to French in France.
      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
      // Displays i formatted as currency for the CurrentCulture.
      // Due to operating system differences, you cannot be sure what currency
      // symbol will be used.
      return (i.ToString("c"));
   }   
   
   [WebMethod]
   public String OverrideUserSetting()
   {
      int i = 100;

      // Sets the CurrentCulture to French in France.
      // Uses the CultureInfo constructor that takes a 
      // useUserOverride parameter.
      // Sets the useUserOverride value to false.
      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR", _
         false);
      // Displays i formatted as currency for the CurrentCulture.
      // This will override any user settings and display the euro symbol.
      return (i.ToString("c"));
   }
}

Windows Forms y las aplicaciones de consola que se ejecuten en todas las versiones del sistema operativo Windows establecen el símbolo de moneda predeterminado a partir de la configuración del equipo del usuario. Como se mencionó anteriormente, esta configuración puede ser incorrecta. Si desea asegurar que una aplicación utilice la configuración predeterminada de .NET Framework, debe crear un objeto CultureInfo que pase el parámetro useUserOverride con su valor establecido a false.

En el ejemplo siguiente se utiliza código similar al del ejemplo anterior. Establece la referencia cultural "fr-FR" y presenta un número entero en la consola con el formato de moneda. Se utiliza la configuración de moneda local del usuario para aplicar formato a la moneda. A continuación, la referencia cultural se establece como "fr-FR" mediante el constructor CultureInfo que acepta el parámetro useUserOverride con su valor establecido a false. Se aplica el formato al número utilizando la configuración predeterminada de .NET Framework y se presenta el símbolo de moneda del euro.

Imports System
Imports System.Globalization
Imports System.Threading

Public Class EuroSymbolSample
   Public Shared Sub Main()
      Dim i As Integer = 100
      
      ' Sets the CurrentCulture to French in France.
      Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
      ' Displays i formatted as currency for the CurrentCulture.
      ' On a version of Windows prior to Windows XP, where the user
      ' has not changed the default currency to euro through the
      ' Control Panel, this will default to "F".
      Console.WriteLine(i.ToString("c"))
      
      
      ' Sets the CurrentCulture to French in France, using the
      ' CultureInfo constructor that takes a useUserOverride parameter.
      ' Sets the useUserOverride value to false. 
      Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR", _ 
         False)
      ' Displays i formatted as default currency for the CurrentCulture.
      ' On a version of Windows prior to Windows XP, this will override an
      ' incorrect default setting of "F" and display the euro symbol ().
      Console.WriteLine(i.ToString("c"))
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class EuroSymbolSample
{
   public static void Main()
   {
      int i = 100;

      // Sets the CurrentCulture to French in France.
      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
      // Displays i formatted as default currency for the CurrentCulture.
      // On a version of Windows prior to Windows XP, where the user
      // has not changed the default currency to euro through the
      // Control Panel, this will default to "F".
      Console.WriteLine(i.ToString("c"));

      // Sets the CurrentCulture to French in France, using the
      // CultureInfo constructor that takes a useUserOverride parameter.
      // Sets the useUserOverride value to false. 
      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR", 
            false);
      // Displays i formatted as default currency for the CurrentCulture.
      // On a version of Windows prior to Windows XP, this will override an
      // incorrect default setting of "F" and display the euro symbol ().
      Console.WriteLine(i.ToString("c"));      
   }
} 

Tenga en cuenta que el entorno de consola no admite el carácter del euro. Si este código se ejecuta en una aplicación de Windows Forms, el resultado es el siguiente:

100,00 F
100,00 €

Muchos países europeos tienen dos monedas de uso común: el euro y la moneda local. Puede haber situaciones en las que sea necesario mostrar ambas monedas en una aplicación. En el ejemplo de código siguiente se crea un objeto CultureInfo para la referencia cultural "fr-FR" donde la moneda predeterminada es el euro. Con el objetivo de mostrar el símbolo de moneda para la moneda local, debe utilizar el métodoNumberFormatInfo.Clone con el fin de clonar un nuevo NumberFormatInfo para CultureInfo y reemplazar el símbolo de moneda predeterminado por un símbolo de moneda local.

Imports System
Imports System.Globalization
Imports System.Threading

Public Class EuroLocalSample
   Public Shared Sub Main()
      ' Creates a CultureInfo for French in France.
      Dim FrCulture As New CultureInfo("fr-FR")
      ' Sets the CurrentCulture to fr-FR.
      Thread.CurrentThread.CurrentCulture = FrCulture
      
      ' Clones the NumberFormatInfo and creates
      ' a new object for the local currency of France.
      Dim LocalFormat As NumberFormatInfo =_
         CType(NumberFormatInfo.CurrentInfo.Clone(), NumberFormatInfo)
      ' Replaces the default currency symbol 
      ' with the local currency symbol.
      LocalFormat.CurrencySymbol = "F"
      
      Dim i As Integer = 100
      ' Displays i formatted as the local currency.
      Console.WriteLine(i.ToString("c", LocalFormat))
      
      ' Displays i formatted as the default currency.
      Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo))
   End Sub
End Class 
using System;
using System.Globalization;
using System.Threading;

public class EuroLocalSample
{
   public static void Main()
   {             
      // Creates a CultureInfo for French in France.
      CultureInfo FrCulture = new CultureInfo("fr-FR");
      // Sets the CurrentCulture to fr-FR.
      Thread.CurrentThread.CurrentCulture = FrCulture;

      // Clones the NumberFormatInfo and creates
      // a new object for the local currency of France.
      NumberFormatInfo LocalFormat = 
         (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
      // Replaces the default currency symbol with the 
      // local currency symbol.
      LocalFormat.CurrencySymbol = "F";

      int i = 100;

      // Displays i formatted as the local currency.
      Console.WriteLine(i.ToString("c", LocalFormat));

      // Displays i formatted as the default currency.
      Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo));
   }
}

Para consultar un ejemplo relacionado, vea el ejemplo Multicurrency del Tutorial rápido de tareas comunes.

Vea también

Conceptos

Aplicar formato para diferentes referencias culturales

Otros recursos

Codificación y localización
Aplicar formato a tipos