You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2013/11/17 19:33:35 UTC
svn commit: r1542789 - in /pdfbox/branches/1.8: ./
pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java
Author: lehmi
Date: Sun Nov 17 18:33:35 2013
New Revision: 1542789
URL: http://svn.apache.org/r1542789
Log:
PDFBOX-1778: use a BigDecimal as internal representation for a COSFloat and save the value as String as well
Modified:
pdfbox/branches/1.8/ (props changed)
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java
Propchange: pdfbox/branches/1.8/
------------------------------------------------------------------------------
Merged /pdfbox/trunk:r1542780
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java?rev=1542789&r1=1542788&r2=1542789&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java Sun Nov 17 18:33:35 2013
@@ -18,10 +18,7 @@ package org.apache.pdfbox.cos;
import java.io.IOException;
import java.io.OutputStream;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
+import java.math.BigDecimal;
import org.apache.pdfbox.exceptions.COSVisitorException;
@@ -29,11 +26,12 @@ import org.apache.pdfbox.exceptions.COSV
* This class represents a floating point number in a PDF document.
*
* @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
- * @version $Revision: 1.17 $
+ *
*/
public class COSFloat extends COSNumber
{
- private float value;
+ private BigDecimal value;
+ private String valueAsString;
/**
* Constructor.
@@ -42,7 +40,8 @@ public class COSFloat extends COSNumber
*/
public COSFloat( float aFloat )
{
- value = aFloat;
+ valueAsString = String.valueOf(aFloat);
+ value = new BigDecimal(valueAsString);
}
/**
@@ -56,7 +55,8 @@ public class COSFloat extends COSNumber
{
try
{
- value = Float.parseFloat( aFloat );
+ valueAsString = aFloat;
+ value = new BigDecimal( valueAsString );
}
catch( NumberFormatException e )
{
@@ -71,7 +71,8 @@ public class COSFloat extends COSNumber
*/
public void setValue( float floatValue )
{
- value = floatValue;
+ valueAsString = String.valueOf(floatValue);
+ value = new BigDecimal(valueAsString);
}
/**
@@ -81,7 +82,7 @@ public class COSFloat extends COSNumber
*/
public float floatValue()
{
- return value;
+ return value.floatValue();
}
/**
@@ -91,17 +92,17 @@ public class COSFloat extends COSNumber
*/
public double doubleValue()
{
- return value;
+ return value.doubleValue();
}
/**
- * This will get the integer value of this object.
+ * This will get the long value of this object.
*
- * @return The int value of this object,
+ * @return The long value of this object,
*/
public long longValue()
{
- return (long)value;
+ return value.longValue();
}
/**
@@ -111,7 +112,7 @@ public class COSFloat extends COSNumber
*/
public int intValue()
{
- return (int)value;
+ return value.intValue();
}
/**
@@ -119,7 +120,7 @@ public class COSFloat extends COSNumber
*/
public boolean equals( Object o )
{
- return o instanceof COSFloat && Float.floatToIntBits(((COSFloat)o).value) == Float.floatToIntBits(value);
+ return o instanceof COSFloat && Float.floatToIntBits(((COSFloat)o).value.floatValue()) == Float.floatToIntBits(value.floatValue());
}
/**
@@ -127,7 +128,7 @@ public class COSFloat extends COSNumber
*/
public int hashCode()
{
- return Float.floatToIntBits(value);
+ return value.hashCode();
}
/**
@@ -158,12 +159,6 @@ public class COSFloat extends COSNumber
*/
public void writePDF( OutputStream output ) throws IOException
{
- DecimalFormat formatDecimal = (DecimalFormat)NumberFormat.getNumberInstance();
- formatDecimal.setMaximumFractionDigits( 10 );
- formatDecimal.setGroupingUsed( false );
- DecimalFormatSymbols symbols = formatDecimal.getDecimalFormatSymbols();
- symbols.setDecimalSeparator( '.' );
- formatDecimal.setDecimalFormatSymbols( symbols );
- output.write(formatDecimal.format( value ).getBytes("ISO-8859-1"));
+ output.write(valueAsString.getBytes("ISO-8859-1"));
}
}
Modified: pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java?rev=1542789&r1=1542788&r2=1542789&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java Sun Nov 17 18:33:35 2013
@@ -20,9 +20,6 @@ package org.apache.pdfbox.cos;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
import java.util.Random;
import junit.framework.Test;
@@ -37,15 +34,6 @@ public class TestCOSFloat extends TestCO
{
// Use random number to ensure various float values are expressed in the test
private Random rnd;
- private DecimalFormat formatDecimal;
- {
- formatDecimal = (DecimalFormat) NumberFormat.getNumberInstance();
- formatDecimal.setMaximumFractionDigits(10);
- formatDecimal.setGroupingUsed(false);
- DecimalFormatSymbols symbols = formatDecimal.getDecimalFormatSymbols();
- symbols.setDecimalSeparator('.');
- formatDecimal.setDecimalFormatSymbols(symbols);
- }
public void setUp()
{
@@ -131,7 +119,9 @@ public class TestCOSFloat extends TestCO
{
float num = i * rnd.nextFloat();
COSFloat testFloat = new COSFloat(num);
- assertEquals((double) num, testFloat.doubleValue());
+ // compare the string representation instead of the numeric values
+ // as the cast from float to double adds some more fraction digits
+ assertEquals(Float.toString(num), Double.toString(testFloat.doubleValue()));
}
}
@@ -170,7 +160,8 @@ public class TestCOSFloat extends TestCO
num = i * rnd.nextFloat();
COSFloat cosFloat = new COSFloat(num);
cosFloat.accept(visitor);
- testByteArrays(formatDecimal.format(num).getBytes("ISO-8859-1"),
+ assertEquals(Float.toString(cosFloat.floatValue()), outStream.toString("ISO-8859-1"));
+ testByteArrays(Float.toString(num).getBytes("ISO-8859-1"),
outStream.toByteArray());
outStream.reset();
}
@@ -195,7 +186,8 @@ public class TestCOSFloat extends TestCO
num = i * rnd.nextFloat();
COSFloat cosFloat = new COSFloat(num);
cosFloat.writePDF(outStream);
- testByteArrays(formatDecimal.format(num).getBytes("ISO-8859-1"),
+ assertEquals(Float.toString(cosFloat.floatValue()), outStream.toString("ISO-8859-1"));
+ testByteArrays(Float.toString(num).getBytes("ISO-8859-1"),
outStream.toByteArray());
outStream.reset();
}