Skip to content

Commit

Permalink
ZSS-666: Smart number "General" formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
henrichen committed May 2, 2014
1 parent 880d2ba commit b0117c6
Show file tree
Hide file tree
Showing 7 changed files with 213 additions and 8 deletions.
13 changes: 10 additions & 3 deletions zss/src/org/zkoss/zss/model/impl/BookCtrl.java
Expand Up @@ -12,14 +12,16 @@

package org.zkoss.zss.model.impl;

import java.util.List;
import java.util.Locale;

import org.zkoss.poi.ss.format.CellFormat;

import org.zkoss.poi.ss.usermodel.PivotCache;
import org.zkoss.poi.ss.util.AreaReference;
import org.zkoss.zss.engine.RefBook;
import org.zkoss.zss.model.Book;
import org.zkoss.zss.model.NumberInputMask;



/**
* Book controls (Internal Use only).
* @author henrichen
Expand Down Expand Up @@ -55,4 +57,9 @@ public interface BookCtrl {
* @since 2.6.0
*/
public NumberInputMask getNumberInputMask();

/**
* @since 2.6.0
*/
public CellFormat getCellFormat(String formatStr, Locale locale);
}
8 changes: 8 additions & 0 deletions zss/src/org/zkoss/zss/model/impl/BookCtrlImpl.java
Expand Up @@ -14,6 +14,9 @@

import java.util.Iterator;
import java.util.WeakHashMap;
import java.util.Locale;

import org.zkoss.poi.ss.format.CellFormat;

import org.zkoss.zss.engine.RefBook;
import org.zkoss.zss.engine.impl.RefBookImpl;
Expand Down Expand Up @@ -75,4 +78,9 @@ private void syncFocus() {
public NumberInputMask getNumberInputMask() {
return new NumberInputMaskImpl();
}

@Override
public CellFormat getCellFormat(String formatStr, Locale locale) {
return CellFormat.getInstance(formatStr == null ? "" : formatStr, locale);
}
}
6 changes: 3 additions & 3 deletions zss/src/org/zkoss/zss/model/impl/BookHelper.java
Expand Up @@ -1016,8 +1016,8 @@ public static RichTextString getText(Cell cell) {
public static FormatTextImpl getFormatText(Cell cell) {
int cellType = cell.getCellType();
final String formatStr = cell.getCellStyle().getDataFormatString();
final Book book = (Book)cell.getSheet().getWorkbook();
if (cellType == Cell.CELL_TYPE_FORMULA) {
final Book book = (Book)cell.getSheet().getWorkbook();
final CellValue cv = BookHelper.evaluate(book, cell);
cellType = cv.getCellType();
// final Hyperlink hyperlink = cv.getEvalHyperlink();
Expand All @@ -1030,8 +1030,8 @@ public static FormatTextImpl getFormatText(Cell cell) {
return new FormatTextImpl(cell.getRichStringCellValue());
}
}

final CellFormat format = CellFormat.getInstance(formatStr == null ? "" : formatStr, ZssContext.getCurrent().getLocale()); //ZSS-68
final CellFormat format = ((BookCtrl)book).getCellFormat(formatStr, ZssContext.getCurrent().getLocale());
return new FormatTextImpl(format.apply(cell));
}

Expand Down
7 changes: 7 additions & 0 deletions zss/src/org/zkoss/zss/model/impl/HSSFBookImpl.java
Expand Up @@ -17,6 +17,7 @@
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
import java.util.Locale;

import org.zkoss.lang.Classes;
import org.zkoss.lang.Library;
Expand All @@ -32,6 +33,7 @@
import org.zkoss.poi.ss.formula.WorkbookEvaluator;
import org.zkoss.poi.ss.formula.ptg.Ptg;
import org.zkoss.poi.ss.formula.udf.UDFFinder;
import org.zkoss.poi.ss.format.CellFormat;
import org.zkoss.poi.ss.usermodel.Color;
import org.zkoss.poi.ss.usermodel.Font;
import org.zkoss.poi.ss.usermodel.FormulaEvaluator;
Expand Down Expand Up @@ -364,4 +366,9 @@ public boolean containsFocus(Object focus) {
public NumberInputMask getNumberInputMask() {
return getBookCtrl().getNumberInputMask();
}

@Override
public CellFormat getCellFormat(String formatStr, Locale locale) {
return getBookCtrl().getCellFormat(formatStr, locale);
}
}
6 changes: 4 additions & 2 deletions zss/src/org/zkoss/zss/model/impl/RangeImpl.java
Expand Up @@ -1301,6 +1301,7 @@ private void copyColumnWidths(Worksheet srcSheet, int widthRepeatCount, int srcl
final Set<Ref> affected = new HashSet<Ref>();
affected.add(dstRef.isWholeColumn() ? dstRef : new AreaRefImpl(0, dstlCol, maxrow, dstRef.getRightCol(), dstRefSheet));
BookHelper.notifySizeChanges(book, affected);
BookHelper.notifyCellChanges(book, affected); //ZSS-666
}

private Ref copyRef(Ref srcRef, int colRepeat, int rowRepeat, Ref dstRef, int pasteType, int pasteOp, boolean skipBlanks, boolean transpose, ChangeInfo info) {
Expand Down Expand Up @@ -1470,9 +1471,10 @@ public void setColumnWidth(int char256) {
final int rCol = ref.getRightCol();
final Worksheet sheet = BookHelper.getSheet(_sheet, refSheet);
final Set<Ref> all = BookHelper.setColumnWidth(sheet, lCol, rCol, char256);
if (all != null) {
final Book book = (Book) _sheet.getWorkbook();
final Book book = (Book) _sheet.getWorkbook();
if (!all.isEmpty()) {
BookHelper.notifySizeChanges(book, all);
BookHelper.notifyCellChanges(book, all); //ZSS-666
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions zss/src/org/zkoss/zss/model/impl/XSSFBookImpl.java
Expand Up @@ -18,6 +18,7 @@
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import java.util.Locale;

import org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTVariant;
import org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTVector;
Expand All @@ -34,6 +35,7 @@
import org.zkoss.poi.ss.formula.WorkbookEvaluator;
import org.zkoss.poi.ss.formula.ptg.Ptg;
import org.zkoss.poi.ss.formula.udf.UDFFinder;
import org.zkoss.poi.ss.format.CellFormat;
import org.zkoss.poi.ss.usermodel.Color;
import org.zkoss.poi.ss.usermodel.Font;
import org.zkoss.poi.ss.usermodel.FormulaEvaluator;
Expand Down Expand Up @@ -441,4 +443,9 @@ public boolean containsFocus(Object focus) {
public NumberInputMask getNumberInputMask() {
return getBookCtrl().getNumberInputMask();
}

@Override
public CellFormat getCellFormat(String formatStr, Locale locale) {
return getBookCtrl().getCellFormat(formatStr, locale);
}
}
174 changes: 174 additions & 0 deletions zsstest/src/org/zkoss/zss/model/impl/ToGeneralTextTest.java
@@ -0,0 +1,174 @@
/**
*
*/
package org.zkoss.zss.model.impl;

import static org.junit.Assert.assertEquals;

import java.util.Locale;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.zkoss.poi.ss.util.NumberToGeneralTextConverter;


/**
* ZSS-628
* Test converstion of double numbers to text in "General" format
* @author henri
*
*/
public class ToGeneralTextTest {
//when column width is 12 characters
private static final Object VAL12[][] = {
{-38277.429999999935, "-38277.43"},
{-38277.430000999935, "-38277.43"},
{-38277.430009999935, "-38277.43001"},
{0.000123456789012345, "0.000123457"},
{-0.000123456789012345, "-0.000123457"},
{0.0000123456789012345, "1.23457E-05"}, // 5
{-0.0000123456789012345, "-1.23457E-05"},
{0.00001234, "0.00001234"},
{0.000012345, "0.000012345"},
{0.0000123456, "1.23456E-05"},
{-1.23456789E+112, "-1.2346E+112"}, //10
{-1.23456789E-112, "-1.2346E-112"},
{-1.2E-112, "-1.2E-112"},
{-12345678901., "-12345678901"},
{-123456789012., "-1.23457E+11"},
{-1234567890123., "-1.23457E+12"}, //15
{-12345678901234., "-1.23457E+13"},
{-123456789012345., "-1.23457E+14"},
{-1234567890123456., "-1.23457E+15"},
{-12345678901234567., "-1.23457E+16"},
{-123456789012345678901., "-1.23457E+20"},
{-1.23456789012345E+21, "-1.23457E+21"},
};

//when column width is 11 characters
private static final Object VAL11[][] = {
{-38277.429999999935, "-38277.43"},
{-38277.430000999935, "-38277.43"},
{-38277.430009999935, "-38277.43"},
{0.000123456789012345, "0.000123457"},
{-0.000123456789012345, "-0.00012346"},
{0.0000123456789012345, "1.23457E-05"}, //5
{-0.0000123456789012345, "-1.2346E-05"},
{0.00001234, "0.00001234"},
{0.000012345, "0.000012345"},
{0.0000123456, "1.23456E-05"},
{-1.23456789E+112, "-1.235E+112"}, //10
{-1.23456789E-112, "-1.235E-112"},
{-12345678901., "-1.2346E+10"},
{-123456789012., "-1.2346E+11"},
{-1234567890123., "-1.2346E+12"},
{-12345678901234., "-1.2346E+13"},
{-123456789012345., "-1.2346E+14"},
{-1234567890123456., "-1.2346E+15"},
{-12345678901234567., "-1.2346E+16"},
{-123456789012345678901., "-1.2346E+20"},
{-1.23456789012345E+21, "-1.2346E+21"},
};

//when column width is 6 characters
private static final Object VAL6[][] = {
{-38277.429999999935, "-38277"},
{-38277.430000999935, "-38277"},
{-38277.430009999935, "-38277"},
{0.000123456789012345, "0.0001"},
{-0.000123456789012345, "-1E-04"},
{0.0000123456789012345, "1E-05"}, //5
{-0.0000123456789012345, "-1E-05"},
{0.00001234, "1E-05"},
{0.000012345, "1E-05"},
{0.0000123456, "1E-05"},
{-1.23456789E+112, "######"}, //10
{-1.23456789E-112, "######"},
{-12345678901., "-1E+10"},
{-123456789012., "-1E+11"},
{-1234567890123., "-1E+12"},
{-12345678901234., "-1E+13"},
{-123456789012345., "-1E+14"},
{-1234567890123456., "-1E+15"},
{-12345678901234567., "-1E+16"},
{-123456789012345678901., "-1E+20"},
{-1.23456789012345E+21, "-1E+21"},
};

//when column width is 6 characters
private static final Object VAL3[][] = {
{-38277.429999999935, "###"},
{-38277.430000999935, "###"},
{-38277.430009999935, "###"},
{0.000123456789012345, "0"},
{-0.000123456789012345, "-0"},
{0.0000123456789012345, "0"}, //5
{-0.0000123456789012345, "-0"},
{0.00001234, "0"},
{0.000012345, "0"},
{0.0000123456, "0"},
{-1.23456789E+112, "###"}, //10
{-1.23456789E-112, "-0"},
{-0.9, "-1"},
{0.9, "0.9"},
{0.0923456789012345, "0.1"},
{-0.0923456789012345, "-0"},
};

/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
}

/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}

@Test
public void testParseNumberInputWidth12() {
for(int j= 0; j < VAL12.length; ++j) {
String result = NumberToGeneralTextConverter.toGeneralText(((Number)VAL12[j][0]).doubleValue(), Locale.US, 12);
assertEquals(VAL12[j][0]+"->"+j, VAL12[j][1], result);
}
}

@Test
public void testParseNumberInputWidth11() {
for(int j= 0; j < VAL11.length; ++j) {
String result = NumberToGeneralTextConverter.toGeneralText(((Number)VAL11[j][0]).doubleValue(), Locale.US, 11);
assertEquals(VAL11[j][0]+"->"+j, VAL11[j][1], result);
}
}

@Test
public void testParseNumberInputWidth6() {
for(int j= 0; j < VAL6.length; ++j) {
try {
String result = NumberToGeneralTextConverter.toGeneralText(((Number)VAL6[j][0]).doubleValue(), Locale.US, 6);
assertEquals(VAL6[j][0]+"->"+j, VAL6[j][1], result);
} catch(Exception e) {
System.out.println("Exception:"+ VAL6[j][0]+"->"+j +"\n"+e);
break;
}
}
}

@Test
public void testParseNumberInputWidth3() {
for(int j= 0; j < VAL3.length; ++j) {
try {
String result = NumberToGeneralTextConverter.toGeneralText(((Number)VAL3[j][0]).doubleValue(), Locale.US, 3);
assertEquals(VAL3[j][0]+"->"+j, VAL3[j][1], result);
} catch(Exception e) {
System.out.println("Exception:"+ VAL3[j][0]+"->"+j +"\n"+e);
break;
}
}
}
}

0 comments on commit b0117c6

Please sign in to comment.