2010-05-02 15 views
33

Necesito almacenar varias monedas en el servidor SQL. Entiendo que SQL no admitirá todos los diferentes tipos de monedas (a menos que lo almacene como una cadena, pero no quiero hacer eso).Convierta cualquier cadena de moneda al doble

Mi idea era convertir todos los valores de su formato de moneda a un doble estándar y almacenar eso en su lugar. A continuación, simplemente vuelva a formatear según la información cultural cuando se muestre. Sin embargo, he intentado hacer algo como, por ejemplo,

var cultureInfo = new System.Globalization.CultureInfo("en-US"); 
double plain = return Double.Parse("$20,000.00", cultureInfo); 

Esto no parece nunca a trabajar siempre lanza una FormatException. Incluso eliminar el símbolo de moneda y simplemente tratar de hacer esto basándose en el número solo hace lo mismo. Este es solo un ejemplo. Quiero admitir prácticamente cualquier tipo de moneda.

¿Existe una forma estándar de separar moneda y obtener el valor como un doble?

+2

No desea almacenar la moneda como un doble; por ejemplo, no puedes almacenar 0.01 con precisión. Use un formato decimal. – staticsan

+0

@statiscan - Actualicé la base de datos no mucho después de esta pregunta para usar decimales. – James

Respuesta

87

creo que esto debería funcionar:

double.Parse(currencyValue, NumberStyles.Currency); 

Aquí se puede ver más acerca de la NumberStyles.

Editar: En caso de que alguien vea esta respuesta sin mirar las otras respuestas/comentarios, esta respuesta respondió la pregunta tal como está escrita, pero almacenar moneda como double no es una buena idea, y sería mejor usar decimal .

+6

Sí, o 'double.Parse (currencyValue, NumberStyles.Currency, cultureInfo') para una cultura determinada. – Noldorin

+0

@ho: Maldición, ¡estaba pasando 'NumberStyles.Any' originalmente! Estaba cerca ... gracias. – James

+2

No es una solución ideal, el signo de libra (por ejemplo) no se analizará si la configuración regional actual es-US –

19

Debe pasar NumberStyles a la función de análisis

Decimal.Parse("$20,000.00", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, new CultureInfo("en-US")); 

Algunas otras cosas, para las monedas que sugeriría que utilice decimal. Y esto podría estar muy lejos, pero podría ser mejor almacenar los datos de la moneda como dinero en la base de datos y agregar un código de moneda para identificar la moneda del valor.

Sí, y las respuestas sugieren NumberStyles.Currency que sería mejor. Es un valor preorientado, si aún piensas que quieres usar las cadenas.

+1

Actualmente estaba usando 'float' como el tipo DB? ¿No es esta una buena idea? – James

+0

@Chris: la razón es que la columna contiene otra información, es decir, no todo lo que se almacena es monetario. ¿Sería seguro almacenar valores no monetarios utilizando este tipo? – James

+0

@James, por lo que, como regla general, no creo que el almacenamiento de diferentes tipos de datos en un campo sea bueno, pero, por supuesto, no conozco su diseño y es posible que tenga una muy buena razón.Entonces ofrezco este consejo, supongo que tiene un indicador que indicará el tipo de datos en el campo. Sugiero que almacene los valores numéricos utilizando un formato de cadena de cultivo invariante consistente y use el indicador para decidir que presente los datos. Por lo tanto, siempre puede extraer los datos y convertirlos a valores numéricos/decimales de forma coherente y luego tomar una decisión sobre la presentación cuando necesite presentar los datos. –

Cuestiones relacionadas