You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by am...@apache.org on 2006/08/09 22:03:37 UTC

svn commit: r430132 - in /jakarta/poi/trunk/src: java/org/apache/poi/hssf/model/FormulaParser.java testcases/org/apache/poi/hssf/model/TestFormulaParser.java

Author: amol
Date: Wed Aug  9 13:03:36 2006
New Revision: 430132

URL: http://svn.apache.org/viewvc?rev=430132&view=rev
Log:
bugfix 38396: Exponential numbers are now handled by the formula parser

Modified:
    jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java
    jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java

Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java
URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java?rev=430132&r1=430131&r2=430132&view=diff
==============================================================================
--- jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java (original)
+++ jakarta/poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java Wed Aug  9 13:03:36 2006
@@ -229,18 +229,36 @@
     }
     
     
+    /** Get the exponent for numbers of form 1.3E21 */
+    private String GetExponent() {
+        StringBuffer retval = new StringBuffer();
+        String sign = "";
+        GetChar();
+        if ('-' == look) {
+            sign = "-";
+            GetChar();
+        }
+        while (IsDigit(look)) {
+            retval.append(look);
+            GetChar();
+        }
+        if (retval.length() > 0) {
+            retval.insert(0, sign);
+        }
+        return retval.toString();
+    }
+
     /** Get a Number */
     private String GetNum() {
-        String Value ="";
+        StringBuffer value = new StringBuffer();
         if  (!IsDigit(look)) Expected("Integer");
         while (IsDigit(look)){
-            Value = Value + look;
+            value.append(look);
             GetChar();
         }
         SkipWhite();
-        return Value;
+        return value.toString();
     }
-
     /** Output a String with Tab */
     private void  Emit(String s){
         System.out.print(TAB+s);
@@ -482,8 +500,18 @@
                 Match('.');
                 String decimalPart = null;
                 if (IsDigit(look)) number = number +"."+ GetNum(); //this also takes care of someone entering "1234."
+                if ('E' == look) {
+                    String exponent = GetExponent();
+                    number += 'E' + exponent;
+                }
                 tokens.add(new NumberPtg(number));
-            } else {
+            }
+            else if ('E' == look) {
+                String exponent = GetExponent();
+                number += 'E'+exponent;
+                tokens.add(new NumberPtg(number));
+            }
+            else {
                 tokens.add(getNumberPtgFromString(number));  //TODO:what if the number is too big to be a short? ..add factory to return Int or Number!
             }
         }

Modified: jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java?rev=430132&r1=430131&r2=430132&view=diff
==============================================================================
--- jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java (original)
+++ jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java Wed Aug  9 13:03:36 2006
@@ -404,6 +404,104 @@
 		
 	}
 
+    // bug 38396 : Formula with exponential numbers not parsed correctly.
+    public void testExponentialParsing() {
+        FormulaParser fp = new FormulaParser("1.3E21/2", null);
+        fp.parse();
+        Ptg[] ptgs = fp.getRPNPtg();
+        assertTrue("three tokens expected, got " + ptgs.length, ptgs.length == 3);
+        assertTrue("NumberPtg", (ptgs[0] instanceof NumberPtg));
+        assertTrue("IntPtg", (ptgs[1] instanceof IntPtg));
+        assertTrue("DividePtg", (ptgs[2] instanceof DividePtg));
+
+        fp = new FormulaParser("1322E21/2", null);
+        fp.parse();
+        ptgs = fp.getRPNPtg();
+        assertTrue("three tokens expected, got " + ptgs.length, ptgs.length == 3);
+        assertTrue("NumberPtg", (ptgs[0] instanceof NumberPtg));
+        assertTrue("IntPtg", (ptgs[1] instanceof IntPtg));
+        assertTrue("DividePtg", (ptgs[2] instanceof DividePtg));
+
+        fp = new FormulaParser("1.3E1/2", null);
+        fp.parse();
+        ptgs = fp.getRPNPtg();
+        assertTrue("three tokens expected, got " + ptgs.length, ptgs.length == 3);
+        assertTrue("NumberPtg", (ptgs[0] instanceof NumberPtg));
+        assertTrue("IntPtg", (ptgs[1] instanceof IntPtg));
+        assertTrue("DividePtg", (ptgs[2] instanceof DividePtg));
+
+    }
+    public void testExponentialInSheet() throws Exception {
+        HSSFWorkbook wb = new HSSFWorkbook();
+
+        wb.createSheet("Cash_Flow");;
+
+        HSSFSheet sheet = wb.createSheet("Test");
+        HSSFRow row = sheet.createRow(0);
+        HSSFCell cell = row.createCell((short)0);
+        String formula = null;
+
+        cell.setCellFormula("1.3E21/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "1.3E21/3", formula);
+
+        cell.setCellFormula("-1.3E21/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-1.3E21/3", formula);
+
+        cell.setCellFormula("1322E21/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "1.322E24/3", formula);
+
+        cell.setCellFormula("-1322E21/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-1.322E24/3", formula);
+
+        cell.setCellFormula("1.3E1/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "13.0/3", formula);
+
+        cell.setCellFormula("-1.3E1/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-13.0/3", formula);
+
+        cell.setCellFormula("1.3E-4/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "1.3E-4/3", formula);
+
+        cell.setCellFormula("-1.3E-4/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-1.3E-4/3", formula);
+
+        cell.setCellFormula("13E-15/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "1.3E-14/3", formula);
+
+        cell.setCellFormula("-13E-15/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-1.3E-14/3", formula);
+
+        cell.setCellFormula("1.3E3/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "1300.0/3", formula);
+
+        cell.setCellFormula("-1.3E3/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-1300.0/3", formula);
+
+        cell.setCellFormula("1300000000000000/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "1.3E15/3", formula);
+
+        cell.setCellFormula("-1300000000000000/3");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-1.3E15/3", formula);
+
+        cell.setCellFormula("-10E-1/3.1E2*4E3/3E4");
+        formula = cell.getCellFormula();
+        assertEquals("Exponential formula string", "-1.0/310.0*4000.0/30000.0", formula);
+    }
+
      public static void main(String [] args) {
         System.out.println("Testing org.apache.poi.hssf.record.formula.FormulaParser");
         junit.textui.TestRunner.run(TestFormulaParser.class);



---------------------------------------------------------------------
To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/