2012-06-13 13 views
9

Actualmente estamos utilizando la siguiente para la creación de valores en dólares de Estados Unidos en nuestra aplicación web:Cómo utilizar NumberFormatInfo para eliminar paréntesis para valores negativos

string.Format("{0:C0}", dollarValue); 

En este ejemplo, si dollarValue es 145, entonces vamos a ver: $ 145. Si es -145, entonces veremos ($ 145) en lugar de - $ 145. Tenga en cuenta que para nosotros, dollarValue es un doble, pero podría ser cualquier tipo de número. Creo.

De todos modos, lo que quiero es que sea $ 145 o - $ 145.

Ahora, según mi investigación, podría ser posible hacerlo con la clase NumberFormatInfo. No puedo entender cómo usarlo, y no puedo encontrar ningún ejemplo válido. Vi esta pregunta aquí: C# creating a custom NumberFormatInfo to display "Free" when a currency value is $0.00 pero el ejemplo de MSDN vinculado a esta pregunta parece un poco diferente de lo que realmente quiero hacer.

me doy cuenta, que tendrá que hacer algo de lo siguiente:

double dollarValue = -145d; 
string myMoney = dollarValue.ToString("C0", someIFormatProvider); 

donde es probable que el tipo de NumberFormatInfo someIFormatProvider. Ahora, lo que he hecho es esto:

NumberFormatInfo ni = new NumberformatInfo(); 
ni.CurrencyNegativePattern = 1; // The value 1 should mean not to use parenthesis 
string myMoney = dollarValue.ToString("C0", ni); 

... y obtengo una excepción de "La instancia es de solo lectura". Mientras que la "documentación" de la propiedad CurrencyNegativePattern dice que puede CONFIGURAR y OBTENER el valor, aparentemente, no puede. Además, NumberFormatInfo es una clase sellada. No puedo crear fácilmente una nueva clase basada en ella y anular el valor.

No entiendo cómo lidiar con esto. En este momento, mi solución es simplemente negar mi valor negativo y tener un resultado positivo que hago el string.Format(...) nuevamente. Sí, me doy cuenta de que no hay ningún signo negativo al frente de esto, pero, por supuesto, eso se resuelve fácilmente agregando un "-" al frente del resultado según sea necesario.

¿Alguien podría darme un ejemplo práctico de cómo usar correctamente la clase NumbefFormatInfo en esta situación? Gracias.

+0

¿Seguro el error proviene de configurar el CurrencyNegativePattern de una instancia NumberFormatInfo? He visto esta excepción de Solo lectura, pero se plantea al intentar modificar las propiedades de CurrentUICulture. – Tisho

+0

El código funciona para mí (después de corregir el caso en 'NumberformatInfo') –

Respuesta

2
double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
string mymoney = dollarValue.ToString("C", modCulture); 
      MessageBox.Show(mymoney); 

Si su sistema operativo actual cultura es en-US, entonces no necesitamos la siguiente línea

System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 

El código será

double dollarValue = -145d; 
string mymoney = dollarValue.ToString("C"); 

y si quieres que ver con NumberFormatInfo

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
    NumberFormatInfo number = modCulture.NumberFormat; 
    string mymoney = dollarValue.ToString("C", number); 

otra manera

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
NumberFormatInfo number = modCulture.NumberFormat; 
string mymoney = dollarValue.ToString(String.Format("C",number)); 
Console.WriteLine(mymoney); 
+0

Y aquí está [el documento] (http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencynegativepattern.aspx). –

+1

Intenté esta respuesta en una aplicación de consola para probar y el resultado fue ($ 145). Si utilicé "C" en lugar de "0: C0", para el formato, obtuve ($ 145.00). – Dan7el

+0

revise la respuesta editada por favor. – MMK

3

Prueba esto ...

string.Format("{0:$#.;-$#.}", -145) 

o

dollarValue.ToString("$#.;-$#.") 
+0

Necesita cambiar el' $ 'y el' -'. –

+0

Y, por supuesto, 'string.Format (" {0: $ #.; - $ #.} ", DollarValue)' es equivalente a 'dollarValue.ToString (" $ #.; - $ #. ")' En el del mismo modo que 'string.Format (" {0: C0} ", dollarValue)' es equivalente a 'dollarValue.ToString (" C0 ")'. –

+0

@Jeppe format fixed .... gracias por la captura ... y me gusta su segunda opción un poco mejor ... cambié para reflejar esto. –

1

'ejemplo es de sólo lectura' significa que tiene una instancia de sólo lectura de NumberFormatInfo.Se puede obtener una instancia puede ser escrito por clonación de un ejemplo de sólo lectura:

NumberFormatInfo writeable = (NumberFormatInfo) ni.Clone(); 
1

¿Estás seguro de que el CurrencyNegativePattern no se puede asignar? He intentado con este código:

double dollarValue = -145d; 
System.Globalization.NumberFormatInfo ni = new System.Globalization.NumberFormatInfo(); 
ni.CurrencyNegativePattern = 1; 
dropDownList.Items.Add(new ListItem(dollarValue.ToString("C0", ni))); 

y es un éxito.

10

Puede hacer una copia de la propiedad NumberFormat en el CurrentCulture (esto asegurará que conserve el símbolo de moneda correcto si globaliza su aplicación). Después de eso, acaba de establecer la propiedad CurrencyNegativePattern al valor deseado y procesar el NumberFormatInfodouble.ToString() en la función, así:

NumberFormatInfo noParens = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone(); 
noParens.CurrencyNegativePattern = 1; 
double dollarValue = -145d; 
string output = dollarValue.ToString("C0", noParens); // outputs -$145 
+0

Interesante. Gracias, esto funcionó. Me alegra ver que no estuve muy lejos en la implementación general. Simplemente no sabía que necesitaba clonarlo. – Dan7el

+1

Esto también le permitirá usar la cultura actual, por lo que no tiene que codificarla en "en-US" en caso de que termine globalizando su aplicación web. –

1

para asegurarse de que permanece en un "US-contexto" me gustaría hacer algo como esto:

double val = -145d; 
NumberFormatInfo nfi = new CultureInfo("en-US").NumberFormat; 
nfi.CurrencyNegativePattern = 1; 
val.ToString("C0", nfi).Dump(); 

El Dump proviene de LINQPad, que muestra -$145 como resultado.

El error que está recibiendo siente como se trata de usted conseguir su NumberFormatInfo algo como esto:

NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; 

En cuyo caso me sustituyo por algo como esto:

NumberFormatInfo nfi = (NumberFormatInfo)Thread.CurrentThread.CurrentCulture.NumberFormat.Clone(); 
Cuestiones relacionadas