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 2020/06/28 13:32:13 UTC

svn commit: r1879308 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java

Author: lehmi
Date: Sun Jun 28 13:32:13 2020
New Revision: 1879308

URL: http://svn.apache.org/viewvc?rev=1879308&view=rev
Log:
PDFBOX-4883: don't save string representation if the float value is replaced based on a proposal by Alfred Faltiska

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.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=1879308&r1=1879307&r2=1879308&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 Jun 28 13:32:13 2020
@@ -53,22 +53,22 @@ public class COSFloat extends COSNumber
     {
         try
         {
-            valueAsString = aFloat;
             value = Float.parseFloat(aFloat);
+            valueAsString = checkMinMaxValues(aFloat) ? null : aFloat;
         }
         catch( NumberFormatException e )
         {
             if (aFloat.startsWith("--"))
             {
                 // PDFBOX-4289 has --16.33
-                valueAsString = aFloat.substring(1);
+                aFloat = aFloat.substring(1);
             }
-            else if (aFloat.matches("^0\\.0*\\-\\d+"))
+            else if (aFloat.matches("^0\\.0*-\\d+"))
             {
                 // PDFBOX-2990 has 0.00000-33917698
                 // PDFBOX-3369 has 0.00-35095424
                 // PDFBOX-3500 has 0.-262
-                valueAsString = "-" + valueAsString.replaceFirst("\\-", "");
+                aFloat = "-" + aFloat.replaceFirst("-", "");
             }
             else
             {
@@ -77,18 +77,26 @@ public class COSFloat extends COSNumber
 
             try
             {
-                value = Float.parseFloat(valueAsString);
+                value = Float.parseFloat(aFloat);
+                checkMinMaxValues(aFloat);
             }
             catch (NumberFormatException e2)
             {
                 throw new IOException("Error expected floating point number actual='" + aFloat + "'", e2);
             }
         }
-        checkMinMaxValues();
-    }
 
+    }
 
-    private void checkMinMaxValues()
+    /**
+     * Check and coerce the value field to be between MIN_NORMAL and MAX_VALUE. Returns "true" if the value was
+     * replaced.
+     * 
+     * @param aFloat the original String representation for the value.
+     * 
+     * @return true if the value was replaced
+     */
+    private boolean checkMinMaxValues(String aFloat)
     {
         if (value == Float.POSITIVE_INFINITY)
         {
@@ -106,21 +114,32 @@ public class COSFloat extends COSNumber
         {
             value = -Float.MIN_NORMAL;
         }
-        else if (value == 0 && valueAsString.matches(".*[1-9].*"))
+        else if (value == 0 && aFloat.matches(".*[1-9].*"))
+        {
+            value = aFloat.startsWith("-") ? -Float.MIN_NORMAL : Float.MIN_NORMAL;
+        }
+        else
         {
-            value = valueAsString.startsWith("-") ? -Float.MIN_NORMAL : Float.MIN_NORMAL;
+            return false;
         }
+        return true;
     }
     
-    private String removeNullDigits(String plainStringValue)
+    /**
+     * If the string represents a floating point number, this will remove all trailing zeros
+     * 
+     * @param plainStringValue a decimal number
+     */
+    private String trimZeros(String plainStringValue)
     {
-        // remove fraction digit "0" only
         int lastIndex = plainStringValue.lastIndexOf('.');
         if (lastIndex > 0)
         {
             int i = plainStringValue.length() - 1;
             while (i > lastIndex + 1 && plainStringValue.charAt(i) == '0')
+            {
                 i--;
+            }
             return plainStringValue.substring(0, i + 1);
         }
         return plainStringValue;
@@ -195,7 +214,7 @@ public class COSFloat extends COSNumber
     {
         if (valueAsString == null)
         {
-            valueAsString = removeNullDigits(new BigDecimal(String.valueOf(value)).toPlainString());
+            valueAsString = trimZeros(new BigDecimal(String.valueOf(value)).toPlainString());
         }
         return valueAsString;
     }