2015-04-05 69 views
0

我一直在爲我母親寫一個小程序,在這個程序中,我必須根據他們要求她做的工作顯示價格清單。由於她需要價格中的所有小數,因此我將Excel上的單元格格式設置爲7位小數。問題是調試我的程序時,當我讀取一個價格的單元格時,它會在實際上未寫入單元格的數字之後添加幾個零。我無法理解發生了什麼,我正在使用OpenOffice將該文件保存爲Excel 97/2003文件,例如「listino.xls」。下面是我使用來獲取作品的名稱和價格代碼:excel閱讀中額外的小數位

public Lavorazione[] creaLavorazioni(Lavorazione[] lavorazioni){ //create Work 

    char[] stringa = new char[8]; 
    double prezzo = 0; 
    String prezzostringa = ""; 

    for(int righe=1;righe<workbookR.getSheet(0).getRows();righe++){ //until the rows of 
//the excel table end 

     try{ 
      lavorazioni[righe-1].setLavorazione(l.LeggiCella(listino, 0, righe)); 
      stringa = l.LeggiCella(listino, 2, righe).toCharArray(); 
      for(int i=0;i<stringa.length;i++){ //getting number and switching "," 
//with "." 
       if(stringa[i]==',') 
        stringa[i]='.'; 

       prezzostringa += stringa[i]; //Creating the price string 
      } 

      prezzostringa=prezzostringa.substring(0, 8); // deleting extra zeros, just 
//in case 
      prezzo = Double.parseDouble(prezzostringa); //casting to double 
      lavorazioni[righe-1].setPrezzo(prezzo); //setting in lavorazioni.prezzo 

     }catch(Exception e){ 
      System.out.println("è successo qualcosa in creaLavorazioni!"); 
     } 
     prezzostringa=""; //resetting for the next cycle 
    } 

    return lavorazioni; 
} 

Lavorazione是我做的,它是這樣的:

public final class Lavorazione { 

private String lavorazione; //name of the work to do 
private double prezzo; //price of it 

public Lavorazione(String lav, double costo){ 
    this.setLavorazione(lav); 
    this.setPrezzo(costo); 
} 

public String getLavorazione() { 
    return lavorazione; 
} 

public void setLavorazione(String lavorazione) { 
    this.lavorazione = lavorazione; 
} 

public double getPrezzo() { 
    return prezzo; 
} 

public void setPrezzo(double prezzo) { 
    this.prezzo = prezzo; 
} 

所以它只是名稱工作和相對價格。簡而言之,當單元格中有「0,05423」時,它會寫入「0.05423000000000001」。任何人都可以幫我解釋一下嗎?使用java.util.Locale是一個好主意嗎?如果你需要更多的信息,請問我。

編輯:我正在使用jxl api。

+0

您是否嘗試過使用BigDecimal而不是double? – CKing 2015-04-05 07:05:10

+1

*「」0,05423「在單元格中,它寫入」0.05423000000000001「。」*似乎它需要['NumberFormat'](https://docs.oracle.com/javase/8/docs/api/java/ text/NumberFormat.html)作爲輸出。可能有關[每個計算機科學家應該知道的關於浮點運算的知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 – 2015-04-05 07:10:14

+0

@bot我嘗試過使用BigDecimal,但它沒有解決問題,它只是讓它更難處理。 – ServantGrunt 2015-04-05 19:18:24

回答

0

我找到了解決方案。問題是,在我這樣做的LeggiExcel類:

public String LeggiCella(Sheet foglio, int col, int riga) { 

     Cell a = foglio.getCell(col, riga); 
     String contenuto = a.getContents(); 

     if (a.getType() == CellType.NUMBER){ 
      contenuto = Double.toString(LeggiCellaNumerica(a)); 
      } 

     return contenuto; 
    } 

    public double LeggiCellaNumerica(Cell a){ 
     double num = 0; 

     NumberCell nc = (NumberCell) a; 
     num = nc.getValue(); 

     return num; 
    } 

因此,這將檢查CellTypeNumberCell,然後得到值,返回它作爲一個雙。然後我會將它轉換爲LeggiCella方法中的字符串,並將其作爲字符串返回。它看起來像在Excel文件中設置單元格格式爲7位小數會使它在數字近似值時變得瘋狂,所以它會在最後設置8或9個零。我現在已經刪除了NumberCell檢查並獲取了單元格的值作爲字符串返回它,並且它正常工作。感謝所有幫助我找到解決方案的人。