Почему я получаю точку (символ точки), которая опережает каждую строку / значение в моей программе, используя Apache POI? - PullRequest
0 голосов
/ 02 декабря 2018

Я впервые использую Apache POI для чтения и хранения данных из файла excel. Вот пример того, что происходит, когда я запускаю программу

Не должно быть никаких точек перед именами.Кроме того, для некоторых состояний, поскольку значения в файле Excel действительно велики, он показывает:

The data from year 2010 to 2017 for .New York is: [1.9405185E7, 1.9526372E7, 
1.9625409E7, 1.9712514E7, 1.977358E7, 1.9819347E7, 1.9836286E7, 1.9849399E7]

Могу ли я использовать BigDecimal, чтобы обойти это?Если это так, я не совсем уверен, как.Мой код для этой программы

public class PopulationEval {

    public static void main(String[] args) throws IOException, 
         InvalidFormatException 
    { 
        File excelFile = new 
        File("C:\\Users\\gg\\Documents\\2017census.xlsx");
        FileInputStream fis = new FileInputStream(excelFile);

        XSSFWorkbook myWorkbook = new XSSFWorkbook(excelFile);

        XSSFSheet mySheet = myWorkbook.getSheetAt(0);

        Iterator<Row> rowIterator = mySheet.iterator();

        int selectedRow = 1;
        HashMap GeographicArea = new HashMap();
        while (rowIterator.hasNext())
        {
            Row row = rowIterator.next();
            Iterator<Cell> cellIterator = row.cellIterator();
            int selectedColumn = 1;

            ArrayList yearlyData = new ArrayList();

            String geographicName = "";
            while(cellIterator.hasNext())
            {
                Cell cell = cellIterator.next();
                switch(cell.getCellType())
                {
                    case Cell.CELL_TYPE_NUMERIC:
                        double num = cell.getNumericCellValue();
                        if(selectedColumn !=1 && selectedRow >=3)
                        {
                            yearlyData.add(num);
                        }

                        break;

                    case Cell.CELL_TYPE_STRING:
                        String stringValue = cell.getStringCellValue();
                        //System.out.print(stringValue );
                        if(selectedRow >= 3 && selectedColumn == 1)
                        {
                            geographicName = stringValue;
                        }
                        if(selectedColumn != 1 && selectedRow >= 3)
                        {
                            yearlyData.add(stringValue);
                        }
                        break;

                }
                selectedColumn++; 
            }
            if(!geographicName.isEmpty())
            {
                GeographicArea.put(geographicName, yearlyData);
            }
            //System.out.println();
            selectedRow++;
        }


        fis.close();

        Scanner input = new Scanner(System.in);


        System.out.println("Which state would you like to view data for from 
        2010 to 2017? Use proper spelling.");
        String user = input.nextLine();

            if(GeographicArea.containsKey(user))
            {
                System.out.println("The data from year 2010 to 2017 for " + 
                user + " is: " + GeographicArea.get(user));
            }
        }
} 

1 Ответ

0 голосов
/ 02 декабря 2018

Вы можете использовать этот вспомогательный метод всякий раз, когда хотите округлить двойное число:

public static double round(double value, int places) {
        if (places < 0) throw new IllegalArgumentException();

        BigDecimal bd = new BigDecimal(Double.toString(value));
        bd = bd.setScale(places, RoundingMode.HALF_UP);
        return bd.doubleValue();
}

И в своей программе, когда вы добавляете двойное значение в список, оберните его в вызов этого метода и предоставьте"места" следующим образом:

yearData.add (round (num, 5));

...