Conservar el formato de un valor doble - Java

Estoy usando Poi para crear libros de Excel en Java. Mis datos sin procesar entran como una cadena. Necesito formatear los datos para ingresar dos decimales en la celda donde se escribe el número. yo suelo Double.parseDouble () para convertir la cadena a numérico y luego usar Formato decimal para formatear el número como una cadena. Otra llamada a Double.parseDouble () para devolver el valor a numérico (la celda a la que va tiene formato numérico, por lo que no puedo usar el valor de cadena) y debería estar bien. El problema es que esa segunda llamada a Double.parseDouble () trunca cualquier cero final desde la derecha del punto decimal. ¿Alguien tiene una idea de cómo puedo forzar este valor para que se lea, por ejemplo, 1.50 en lugar de 1.5?

preguntado el 03 de mayo de 12 a las 18:05

Espera, ¿estás haciendo String -> Double -> String -> Double? ¿Y es la última Cadena -> Doble la que está cambiando su formato? ¿Siempre quiere 2 dígitos, o quiere la cantidad con la que vino la cadena? -

Siempre quiero dos decimales. Si la cadena viene como 1.5, quiero que lea 1.50. -

3 Respuestas

I always want two decimals.

Solución: Aplique siempre un patrón de formato decimal específico.

Fragmento de código de muestra:

//java.text.DecimalFormat df = new java.text.DecimalFormat( "###0.00" );  
java.text.DecimalFormat df = new java.text.DecimalFormat();  
df.applyPattern( "###0.00" ); // always two decimals  

double dbl = 1.50d ;  

// prints: dbl =  1.5
System.out.println( "dbl = " + dbl );  

// prints: df.format( 1.5 ) = 1.50
System.out.println ( "df.format( " + dbl + " ) = " + df.format( dbl ) );

ACTUALIZACIÓN:
De acuerdo, según su publicación, entiendo que está tratando de completar la celda con formato numérico solo para imprimir o mostrar con dos posiciones decimales. Sabes que, por defecto, todos los campos numéricos se interpretan omitiendo los ceros finales. Para lograr su requisito, es posible que necesite utilizar CellFormat y/o DataFormatter en su contexto Cell objeto, pero cuando se dice Format, es un String de nuevo.

No probé el siguiente código, pero puede ayudarte.

DataFormatter dataFormatter = new DataFormatter();
dataFormatter.setDefaultNumberFormat( instanceOfDesiredDecimalFormat );  
// or  
// dataFormatter.setExcelStyleRoundingMode( instanceOfDesiredDecimalFormat );  

// apply this format on the cell you want
dataFormatter.formatCellValue( instanceOfNumericCellInContext );  

contestado el 03 de mayo de 12 a las 21:05

DecimalFormat devuelve una cadena. Necesito devolver un doble. Por eso, en la pregunta original, tengo que usar Double.parseDouble dos veces. - mike preston

En realidad, no está haciendo nada en la mayor parte del código que describió. También podría devolver Double.parseDouble(inputString). Los dobles se almacenan en formato binario y los ceros iniciales y finales no tienen sentido. Quizás el BigDecimal la clase es algo para ti.

contestado el 03 de mayo de 12 a las 19:05

Gran sugerencia. Estoy limitado en el sentido de que Poi solo tomará un valor doble en un campo con formato numérico, pero creo que, en otras circunstancias, su respuesta habría resuelto mi situación. - mike preston

@MikePreston Me temo que no conozco el PDI, pero seguramente debe haber una solución real ... ¿Intenta preguntar en un foro específico de PDI? - mariods

Parece que estamos en un callejón sin salida. Como señaló Mario, los dobles se gestionan como binarios y no hay forma de formatear el binario. como un doble, excepto para convertirlo en una cadena con DecimalFormat, que ya no es un doble. Le expliqué esto a mi jefe y está de acuerdo con la solución de tomar el doble sin procesar, así que estoy cerrando este problema. Gracias a todos por su ayuda y apoyo.

saludos mike

contestado el 04 de mayo de 12 a las 19:05

Puede configurar explícitamente una Celda existente en PDI para usar el tipo Cadena y recuperar ese valor como Cadena en lugar de numérico (doble). A partir de ahí, puede usar las sugerencias de formato descritas en las otras publicaciones. - pm_labs

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.