2009-07-01 27 views
22

Esto debería ser un problema fácil, pero ...formato de moneda

que necesito para dar formato a una moneda para su visualización (cadena) en C#

La moneda en cuestión tendrá sus propias reglas, tales como el símbolo de utilizar y si ese símbolo debe venir antes del valor (por ejemplo, $ 10) o después (por ejemplo, 10 ₫ que es Dong vietnamita).

Pero la forma en que se formatean los números depende de los usuarios locales, no de la moneda.

E.g.

1.234,56 ₫ should be displayed to a user in Vietnam but 
1,234.56 ₫ should be displayed to a user in the US 

(con formato de código de manera fácil ver la diferencia entre, y.)

Así código como

Double vietnamTotal = 1234.56; 
return vietnamTotal.ToString("c"); 

no funcionará, ya que utilizará los usuarios (o más accuratly CultureInfo.CurrentCulture) configuración regional para el formato y la moneda para que pueda obtener cosas como $ 1,123.56 - uso correcto de, y. pero símbolo equivocado

Double vietnamTotal = 1234.56; 
CultureInfo ci = new CultureInfo(1066); // Vietnam 
return vietnameTotal.ToString("c",ci)); 

daría 1.234,56 ₫ - Símbolo correcto, mal uso de, y. para el usuario actual.

Este post gives more detail sobre qué hacer, pero no cómo hacerlo.

¿Qué método obvio oculto en el marco me falta?

Respuesta

26
  • Tome la NumberFormatInfo de la moneda del usuario, y clonarlo
  • Ajuste el CurrencySymbol en el formato clonado a la CurrencySymbol de la moneda de que se trate
  • Si desea que la posición de la moneda (y algunos otros aspectos de el formato) para ser copiado, establece CurrencyPositivePattern y CurrencyNegativePattern de la misma manera.
  • Utilice el resultado para formatear.

Por ejemplo:

using System; 
using System.Globalization; 

class Test 
{  
    static void Main() 
    { 
     decimal total = 1234.56m; 
     CultureInfo vietnam = new CultureInfo(1066); 
     CultureInfo usa = new CultureInfo("en-US"); 

     NumberFormatInfo nfi = usa.NumberFormat; 
     nfi = (NumberFormatInfo) nfi.Clone(); 
     NumberFormatInfo vnfi = vietnam.NumberFormat; 
     nfi.CurrencySymbol = vnfi.CurrencySymbol; 
     nfi.CurrencyNegativePattern = vnfi.CurrencyNegativePattern; 
     nfi.CurrencyPositivePattern = vnfi.CurrencyPositivePattern; 

     Console.WriteLine(total.ToString("c", nfi)); 
    } 
} 

Es cierto que mi consola no logra mostrar el símbolo correcto, pero estoy seguro de que es sólo debido a problemas de fuente :)

+0

Casi Jon, gracias - sin embargo, no consigue la posición del símbolo de moneda correcta (por ejemplo, Vietnam o España colocar el símbolo de moneda después del valor) se podría argumentar que la posición depende de la cultura de los usuarios (como separato decimal r) pero productos como Excel y SharePoint hacen la posición en función de la cultura de la moneda. – Ryan

+0

De acuerdo, arreglando eso entonces ... –

+0

Hecho - es posible que desee ver las otras propiedades relacionadas con la moneda, aunque parece que no quiere cambiar el tamaño de la agrupación o los símbolos. –

1

Lo sentimos, puedo estar un poco lento aquí, pero aún no veo tu punto. Me parece que la pregunta original es "Tengo un valor de dong que, en Vietnam, quiero que se muestre según el formato de moneda vietnamita, con un símbolo" ₫ ", y en los EE. UU., Que deseo que se muestre según el formato de moneda estadounidense , pero aún con un "₫" "..

Creo que estoy confundirse por las dos declaraciones contradictorias ... "La moneda en cuestión tendrá sus propias reglas" y "cómo los números con formato depende de los usuarios locales [sic], no la moneda."

Si todo lo que quería era cambiar el símbolo de moneda, y dejar el formato según la cultura actual, no sería la clonación del NFI y establecer el símbolo sea suficiente?

 NumberFormatInfo nfi; 

    // pretend we're in Vietnam 
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("vi-VN"); 

    nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo; 
    nfi.CurrencySymbol = "₫"; 

    String s1 = (1234.5678).ToString("c", nfi); 

    // pretend we're in America 
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 

    nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo; 
    nfi.CurrencySymbol = "₫"; 

    String s2 = (1234.5678).ToString("c", nfi); 
+0

Lo siento ... parece que este paseo fue demasiado grande para un comentario. –

+0

Que es exactamente lo que Jon propuso en su respuesta. – Ryan

+0

Y al punto - si USTED fue a un sitio web para ver el precio de algo en Franch, ¿le gustaría ver € 1,234.56 (símbolo del euro, formato US/UK) o € 1.234,56 (símbolo del euro y formato francés). – Ryan

0

Para trabajar con un cuadro de texto, intente lo siguiente:.

textBox2.Text = "Rp" + (textBox1.Text = string.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text))); 
Cuestiones relacionadas