2016-12-23 11 views
0

У меня есть файл, который представляет количество миллионов, подобных этому 29.879.999, и двойные номера, подобные этому 28.09. Я пытаюсь их проанализировать с помощью NumberFormat и конвертировать их все (целое и двойное) в double. Вот что я писал:Разбор двойных чисел и миллионов

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

Результаты:

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

Входной файл выглядит так:

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 

Я хочу, чтобы разобрать их все как double как 28.09 даже миллионы. Любая помощь приветствуется. Спасибо!

+0

Имеет ли файл число в диапазоне 1000-999999? (как в цифрах, которые выглядят как 1.000-999.999). Как бы вы отличали их от парных? –

+0

Он представляет тысячи, таких как 20.000, миллионы, такие как 120.000.000 и десятичные числа, подобные этому 30.42 или -0.0315 – flower

+0

Итак, откуда вы знаете, что «20.000» означает «20 тысяч», а не «20, до 3 десятичных знаков точности» ? –

ответ

1

при условии, что следующее является допустимым форматом

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

all others are integers. 

то все, что вам нужно сделать, это изменить 3 десятичные условия «». Это изменит ваши номера в

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

и использовать Locale.GERMANY, чтобы сделать ваш PARSING

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

EDIT: это то, что я хотел бы сделать, чтобы преобразовать десятичные.

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(); 
+0

получить результаты, как это: closingvalue 2925,0 closingvalue 2.9879999E7 closingvalue 2809,0 closingvalue 2.7219999E7 closingvalue 2.5969999E7 closingvalue 2491,0 closingvalue 2635,0 я считаю, что, например, формат 2491,0 неправильно, потому что он должен был быть 24,91 – flower

+0

@flower, вам нужно будет преобразовать строку 29.25 до 29,25 первого ...сделайте чек, чтобы увидеть, является ли последняя 3-я цифра «.». если это так, измените его на "," - попробуйте nf.parse ("29,25") непосредственно с запятой? –

+0

Я пытаюсь использовать 'split (". ")', Так что я могу использовать вышеизложенное только для чисел с более чем двумя "." но он вообще не разбивается, он дает нулевую длину. 'for (String [] entry: data) { \t \t \t String [] entryparsed = entry [4] .split (". "); \t \t \t для (INT I = 0; я flower

0

Ваши ценности не удваиваются, а целые числа (миллионы или миллиарды) на самом деле, потому что java не понимает большие числа с точками. Кстати, я рекомендую вам BigInteger или BigDecimal иметь дело с большими цифрами.

0

Используйте DecimalFormat для форматирования текста, как показано ниже.

DecimalFormat decimal = new DecimalFormat("#0.00"); 
System.out.println(decimal.format(487384.321313112)); 
+0

Я пробовал эту гайку, я получаю java.lang.IllegalArgumentException: не может отформатировать данный объект как число 'DecimalFormat decimal = new DecimalFormat (" # 0.00 "); Строковое значение = decimal.format (запись [4]); System.out.println ("closedvalue" + значение); ' – flower

+0

Формат @flower не принимает значение« String »в качестве входного. он принимает только примитивы и их вариации объектов, такие как Long, Double, BigDecimal, BigInteger, AtomicInteger и т. д. ... в соответствии с вашей проблемой сначала вам нужно проанализировать входные данные. –