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:25:44 UTC
svn commit: r1542780 - in /pdfbox/trunk/pdfbox/src:
main/java/org/apache/pdfbox/cos/COSFloat.java
test/java/org/apache/pdfbox/cos/TestCOSFloat.java
Author: lehmi
Date: Sun Nov 17 18:25:44 2013
New Revision: 1542780
URL: http://svn.apache.org/r1542780
Log:
PDFBOX-1778: use a BigDecimal as internal representation for a COSFloat and save the value as String as well
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java?rev=1542780&r1=1542779&r2=1542780&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java Sun Nov 17 18:25:44 2013
@@ -18,9 +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;
@@ -32,7 +30,8 @@ import org.apache.pdfbox.exceptions.COSV
*/
public class COSFloat extends COSNumber
{
- private float value;
+ private BigDecimal value;
+ private String valueAsString;
/**
* Constructor.
@@ -41,7 +40,8 @@ public class COSFloat extends COSNumber
*/
public COSFloat( float aFloat )
{
- value = aFloat;
+ valueAsString = String.valueOf(aFloat);
+ value = new BigDecimal(valueAsString);
}
/**
@@ -55,7 +55,8 @@ public class COSFloat extends COSNumber
{
try
{
- value = Float.parseFloat( aFloat );
+ valueAsString = aFloat;
+ value = new BigDecimal( valueAsString );
}
catch( NumberFormatException e )
{
@@ -70,7 +71,8 @@ public class COSFloat extends COSNumber
*/
public void setValue( float floatValue )
{
- value = floatValue;
+ valueAsString = String.valueOf(floatValue);
+ value = new BigDecimal(valueAsString);
}
/**
@@ -80,7 +82,7 @@ public class COSFloat extends COSNumber
*/
public float floatValue()
{
- return value;
+ return value.floatValue();
}
/**
@@ -90,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();
}
/**
@@ -110,7 +112,7 @@ public class COSFloat extends COSNumber
*/
public int intValue()
{
- return (int)value;
+ return value.intValue();
}
/**
@@ -118,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());
}
/**
@@ -126,7 +128,7 @@ public class COSFloat extends COSNumber
*/
public int hashCode()
{
- return Float.floatToIntBits(value);
+ return value.hashCode();
}
/**
@@ -157,12 +159,6 @@ public class COSFloat extends COSNumber
*/
public void writePDF( OutputStream output ) throws IOException
{
- DecimalFormat formatDecimal = (DecimalFormat)NumberFormat.getNumberInstance();
- formatDecimal.setMaximumFractionDigits( 5 );
- 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/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java?rev=1542780&r1=1542779&r2=1542780&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java Sun Nov 17 18:25:44 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();
}