Tengo un archivo que representa números de millones como este 29.879.999 y números dobles como este 28.09. Estoy tratando de analizarlos usando NumberFormat y convertirlos todos (enteros y dobles) a double. Aquí está lo que escribí:

for (String[] entry : data) {
NumberFormat nf = NumberFormat.getInstance();
Number value = nf.parse(entry[4]).doubleValue();
System.out.println("closingvalue: "+value);
}

Los resultados son:

closingvalue  2925.0
closingvalue  2.9879999E7
closingvalue  2809.0
closingvalue  2.7219999E7
closingvalue  2.5969999E7
closingvalue  2491.0
closingvalue  2635.0
closingvalue  2591.0

El archivo de entrada es así:

Date;Open;High;Low;Close;Log Return
2/1/2009;31.190.001;31.639.999;30.469.999;31.35;-
5/1/2009;30.73;30.77;29.08;29.25;-0.0693
6/1/2009;29.790.001;30.42;29.51;29.879.999;0.0213
7/1/2009;29.15;29.40;28.00;28.09;-0.0618
8/1/2009;27.90;27.950.001;26.860.001;27.219.999;-0.0315

Quiero analizarlos a todos como double como 28.09 incluso los millones. ¡Cualquier ayuda se agradece, gracias!

0
flower 23 dic. 2016 a las 15:09

3 respuestas

La mejor respuesta

Asumiendo que el siguiente es un formato válido

contains decimals
0.<any number> 
-0.<any number>
1.234.567.89 (last third digit is ".")

all others are integers. 

Entonces todo lo que tiene que hacer es cambiar las 3 condiciones decimales a ",". Esto cambiará sus números a

0,<any number>
-0,<any number>
1.234.567,89 (last third digit is now ",") 

Y usa Locale.GERMANY para hacer tu análisis

NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
Double parsedNumber = nf.parse(value[4]).doubleValue();

EDITAR: esto es lo que haría para convertir los decimales.

String testString = value[4];
if(testString.size() >= 3){  //must be at least 3 digits
    int last3rdPosition = testString.size() - 3; 

    if(testString.charAt(last3rdPosition) == '.'){

         //check if the last third char is "."
         //handle cases like 31.35 (change it to 31,35)
         testString.setChar(last3rdPosition, ',');
    } else if (testString.charAt(0) == '0' 
               && testString.charAt(1) == '.'){

         //handle cases like 0.0213 (change it to 0,0213)
         testString.setChar(1, ',')
    }else if (testString.charAt(0) == '-' 
               && testString.charAt(1) == '0'
               && testString.charAt(2) == '.'){

         //handle cases like -0.0315 (change it to -0,0315)
         testString.setChar(2, ',')
    } 

}  
// do converting as per normal using Locale.GERMANY
// Locale.GERMANY will treat "." as the thousands separator
//                       and "," as the decimal separator
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
Double parsedNumber = nf.parse(testString).doubleValue(); 
1
Angel Koh 23 dic. 2016 a las 15:45

Sus valores no son dobles sino enteros (millones o billones) en realidad porque Java no comprende grandes números con puntos. Por cierto, te recomiendo BigInteger o BigDecimal para lidiar con grandes números.

0
Gürtuğ Güngör 23 dic. 2016 a las 12:17

Use DecimalFormat para formatear el texto como se muestra a continuación.

DecimalFormat decimal = new DecimalFormat("#0.00");
System.out.println(decimal.format(487384.321313112));
0
Kiran Kumar 23 dic. 2016 a las 12:21