Compartir a través de


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

Actualización: noviembre 2007

La clase NumberFormatInfo 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, 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 moneda 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 moneda para los países de la zona del euro

Tanto la clase CultureInfo como RegionInfo incluyen información sobre 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 doce países. Las versiones anteriores de Windows aún establecen la moneda local como símbolo de moneda predeterminado para esos países.

Debe tener en cuenta las diferencias de los sistemas operativos con respecto a los símbolos de moneda 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 moneda 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 moneda 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 moneda al euro a través de las opciones de configuración regional e idioma 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. 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 moneda 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 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 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 moneda. En este caso, se garantiza que se va a utilizar el símbolo del euro porque es el predeterminado de .NET Framework.

 [Visual Basic]
<%@ 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. 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 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 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 moneda del euro.

 [Visual Basic]
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 de la moneda local, debe utilizar el método NumberFormatInfo.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