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

La clase NumberFormatInfo define cómo se aplica formato a la divisa, los separadores decimales y otros símbolos numéricos basados en la referencia cultural, y también cómo se muestran. Por ejemplo, el formato del número decimal 10000.50 es 10,000.50 en la referencia cultural inglés (Estados Unidos), "en-US", y 10.000,50 en la referencia cultural alemán (Alemania), "de-DE".

Se puede crear un objeto NumberFormatInfo para una referencia cultural determinada 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. Si la aplicación intenta crear un objeto NumberFormatInfo mediante una referencia cultural neutra, se produce una excepción.

En el ejemplo de código siguiente se muestra un número entero utilizando el formato de divisa estándar ("c") NumberFormatInfo de la referencia cultural actual.

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 divisa para los países de la zona del euro

Tanto la clase CultureInfo como RegionInfo incluyen información sobre la divisa. Sólo se especifica una divisa por cada referencia cultural. El euro es la divisa 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 divisas en euros. Por lo tanto, .NET Framework y Microsoft Windows XP establecen el euro como símbolo de divisa predeterminado para esos doce países. Las versiones anteriores de Windows aún establecen la divisa local como símbolo de divisa predeterminado para esos países.

Debe tener en cuenta las diferencias de los sistemas operativos con respecto a los símbolos de divisa predeterminados. En Windows, los usuarios pueden invalidar algunos de los valores asociados a la referencia cultural predeterminada del sistema, mediante las opciones de configuración regional e idioma del Panel de control. Por ejemplo, el usuario puede decidir mostrar la divisa utilizando un símbolo diferente al predeterminado para la referencia cultural. Los formularios Windows Forms y las aplicaciones de consola utilizan el símbolo de divisa predeterminado especificado en el sistema operativo. 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 divisa al euro a través de las opciones de configuración regional e idioma del Panel de control, tendrá una configuración de divisa 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 divisa 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 divisa coherente. La aplicación debe crear un objeto CultureInfo mediante una de las sobrecargas del constructor que acepte un parámetro useUserOverride y establezca en false el valor de este parámetro. Esto hará que la configuración de divisa predeterminada del sistema operativo del usuario sea invalidada 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 en francés (Francia), "fr-FR", y devuelve un número entero con formato de divisa. 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 del servidor web XML OverrideUserSetting establece la propiedad CurrentCulture en "fr-FR" utilizando el constructor CultureInfo que acepta un parámetro useUserOverride con un valor false. Este método recupera un entero con formato de divisa. En este caso, 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 divisa predeterminado a partir de la configuración del equipo del usuario. Como se mencionó anteriormente, esta configuración puede ser incorrecta. Para garantizar que se utilice la configuración predeterminada de .NET Framework, su aplicación debe crear un objeto CultureInfo, pasando un parámetro useUserOverride establecido en 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 divisa. Se utiliza la configuración de divisa local del usuario para aplicar formato a la divisa. A continuación, la referencia cultural se establece en "fr-FR" utilizando el constructor CultureInfo que acepta el parámetro useUserOverride establecido en false. Después, se aplica el formato al número utilizando la configuración predeterminada de .NET Framework y se presenta el símbolo de divisa 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 divisas de uso común: el euro y la divisa local. Puede haber situaciones en las que sea necesario mostrar ambas divisas en una aplicación. En el ejemplo de código siguiente se crea un objeto CultureInfo para la referencia cultural "fr-FR" donde la divisa predeterminada es el euro. Con el objetivo de mostrar el símbolo de la divisa local, debe utilizar el método NumberFormatInfo.Clone con el fin de clonar un nuevo NumberFormatInfo para CultureInfo y reemplazar el símbolo de divisa predeterminado por un símbolo de divisa 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

Otros recursos

Codificación y localización

Formatting Types

Formatting for Different Cultures