|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
Problema con DecimalFormat
Hola a todos, estoy usando un objeto DecimalFormat para formatear los números que voy metiendo al pulsar botones y salgan separados por comas, separados por miles. El problema aparece que solo me deja meter 15 números y después se añaden siempre 0 independientemente del numero q pulse. Me he leído toda la documentación de decimalformat y numberformat y no he encontrado nada. Por favor si alguien me puede ayudar estaría muy agradecido.
Gracias de antemano. Saludos |
|
#2
|
||||
|
||||
¿El número sin formatear cómo lo guardas? ¿Tiene el valor esperado antes de formatearlo? ¿Es un long o es un int?
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
#3
|
||||
|
||||
Es en una calculadora, entonces es un double que conforme se van pulsando botones se va multiplicando por 10 y sumando el numero pulsado y todo eso se formatea cada vez que se pulsa cualquier numero para q vaya apareciendo la separacion por miles conforme pulsas números. Pero yo diría que si, q el double se va guardando bien pero al formatearlo falla. Alguna solución?
|
#4
|
||||
|
||||
Has alcanzado el límite de precisión del double. El tipo double a partir de los 15-17 dígitos de precisión empieza a almacenar los valores en forma de potencias para poder representar números muy grandes sin crecer el número de bits. Si necesitas manejar tantos dígitos en la parte entera (entiendo que no... no sé cuál será la aplicación pero seguro que son despreciables esos números) tendrías que irte a la clase BigDecimal que tiene una precisión arbitraria (no limitada) y puedes meterle el número que quieras. Incluso las calculadoras de verdad te muestran resultados con un número finito de dígitos y luego te plantan el exponente para saber cuántos ceros hay que añadir (10 elevado a lo que sea).
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 19/10/13 a las 14:06:26. |
Gracias de parte de: | ||
#5
|
||||
|
||||
Pues no, compruébalo ;)
Has alcanzado el límite de precisión del double. El tipo double a partir de los 15-17 dígitos de precisión empieza a almacenar los valores en forma de potencias para poder representar números muy grandes sin crecer el número de bits. Si necesitas manejar tantos dígitos en la parte entera (entiendo que no... no sé cuál será la aplicación pero seguro que son despreciables esos números) tendrías que irte a la clase BigDecimal que tiene una precisión arbitraria (no limitada) y puedes meterle el número que quieras. Incluso las calculadoras de verdad te muestran resultados con un número finito de dígitos y luego te plantan el exponente para saber cuántos ceros hay que añadir (10 elevado a lo que sea). ![]() Muchas gracias de nuevo, le echare un ojo a la clase BigDecimal que comentas. Un saludo |
#6
|
||||
|
||||
Perdona, antes me equivoque. Pasaba el numero a double para poder formatearlo con la clase DecimalFormat y añadir así la separación de los miles en el numero. He estado mirando por encima y no he visto que algo así se pueda hacer con BigDecimal, alguna sugerencia para poder formatear el BigDecimal y que vayan apareciendo las separaciones de los números conforme se van pulsando? Muchas gracias de nuevo
Saludos |
#7
|
||||
|
||||
No estoy puesto en el DecimalFormat pero en principio le puedes pasar un BigDecimal (los métodos que aceptan un Object como argumento) y te lo formatea igualmente.
EDITO: el format de DecimalFormat dice que llama al doubleValue del objeto, en cuyo caso te va a dar igual. Pues no sé, lo mejor es que no dejes al usuario meter tantos dígitos y pases a notación científica cuando haya escrito los 15 dígitos.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 19/10/13 a las 15:24:59. |
Gracias de parte de: | ||
#8
|
||||
|
||||
Como dice mocelet, tienes que usar el método "format" que su primer parámetro es un "Object". Ya que aunque el tipo del parámetro es "Object" realmente sólo acepta subclases de "Number" (vete a saber porque Oracle le ha puesto "Object" entonces), y "BigDecimal" es una subclase de "Number" (al igual que Byte, Double, Float, Integer, BigInteger, BigDecimal, etc, además de subclases propias que puedes hacerte)
|
Gracias de parte de: | ||
#9
|
||||
|
||||
Como dice mocelet, tienes que usar el método "format" que su primer parámetro es un "Object". Ya que aunque el tipo del parámetro es "Object" realmente sólo acepta subclases de "Number" (vete a saber porque Oracle le ha puesto "Object" entonces), y "BigDecimal" es una subclase de "Number" (al igual que Byte, Double, Float, Integer, BigInteger, BigDecimal, etc, además de subclases propias que puedes hacerte)
![]() No estoy puesto en el DecimalFormat pero en principio le puedes pasar un BigDecimal (los métodos que aceptan un Object como argumento) y te lo formatea igualmente.
EDITO: el format de DecimalFormat dice que llama al doubleValue del objeto, en cuyo caso te va a dar igual. Pues no sé, lo mejor es que no dejes al usuario meter tantos dígitos y pases a notación científica cuando haya escrito los 15 dígitos. ![]() Muchas gracias por vuestra ayuda. si se os ocurre alguna otra forma de hacerlo por favor me gustaría solucionarlo. Si yo lo consiguiera hacer lo postearé. Un saludo |
#10
|
||||
|
||||
Se veía venir con lo que decía el API, pues me da que vas a tardar menos añadiendo las comas o los puntos a mano (eso sí, consulta el DecimalFormatSymbols para saber cuál es el separador para agrupar los millares - getGroupingSeparator() y el de los decimales getDecimalSeparator()).
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
#11
|
||||
|
||||
Se veía venir con lo que decía el API, pues me da que vas a tardar menos añadiendo las comas o los puntos a mano (eso sí, consulta el DecimalFormatSymbols para saber cuál es el separador para agrupar los millares - getGroupingSeparator() y el de los decimales getDecimalSeparator()).
![]() Muchas gracias por todo ![]() |
![]() |
![]() |
||||||
|