You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ch...@apache.org on 2015/03/23 06:13:20 UTC

svn commit: r1668517 - in /commons/proper/lang/trunk/src: main/java/org/apache/commons/lang3/time/FastDatePrinter.java test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java

Author: chas
Date: Mon Mar 23 05:13:20 2015
New Revision: 1668517

URL: http://svn.apache.org/r1668517
Log:
LANG-1100: Avoid memory allocation when using date formating to StringBuffer

Modified:
    commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
    commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java

Modified: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java?rev=1668517&r1=1668516&r2=1668517&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java (original)
+++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java Mon Mar 23 05:13:20 2015
@@ -32,8 +32,6 @@ import java.util.TimeZone;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.commons.lang3.Validate;
-
 /**
  * <p>FastDatePrinter is a fast and thread-safe version of
  * {@link java.text.SimpleDateFormat}.</p>
@@ -778,10 +776,9 @@ public class FastDatePrinter implements
             if (value < 10) {
                 buffer.append((char)(value + '0'));
             } else if (value < 100) {
-                buffer.append((char)(value / 10 + '0'));
-                buffer.append((char)(value % 10 + '0'));
+                appendDigits(buffer, value);
             } else {
-                buffer.append(Integer.toString(value));
+                buffer.append(value);
             }
         }
     }
@@ -856,7 +853,7 @@ public class FastDatePrinter implements
          */
         @Override
         public int estimateLength() {
-            return 4;
+            return mSize;
         }
 
         /**
@@ -871,24 +868,15 @@ public class FastDatePrinter implements
          * {@inheritDoc}
          */
         @Override
-        public final void appendTo(final StringBuffer buffer, final int value) {
-            if (value < 100) {
-                for (int i = mSize; --i >= 2; ) {
-                    buffer.append('0');
-                }
-                appendDigits(buffer, value);
-            } else {
-                int digits;
-                if (value < 1000) {
-                    digits = 3;
-                } else {
-                    Validate.isTrue(value > -1, "Negative values should not be possible", value);
-                    digits = Integer.toString(value).length();
-                }
-                for (int i = mSize; --i >= digits; ) {
-                    buffer.append('0');
-                }
-                buffer.append(Integer.toString(value));
+        public final void appendTo(final StringBuffer buffer, int value) {
+            // pad the buffer with adequate zeros
+            for(int digit = 0; digit<mSize; ++digit) {
+                buffer.append('0');                
+            }
+            // backfill the buffer with non-zero digits
+            int index = buffer.length();
+            for( ; value>0; value /= 10) {
+                buffer.setCharAt(--index, (char)('0' + value % 10));
             }
         }
     }
@@ -932,7 +920,7 @@ public class FastDatePrinter implements
             if (value < 100) {
                 appendDigits(buffer, value);
             } else {
-                buffer.append(Integer.toString(value));
+                buffer.append(value);
             }
         }
     }

Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java?rev=1668517&r1=1668516&r2=1668517&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java (original)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java Mon Mar 23 05:13:20 2015
@@ -310,7 +310,6 @@ public class FastDatePrinterTest {
         final String three;
     }
 
-
     @Test
     public void test1806() throws ParseException {
         for (Expected1806 trial : Expected1806.values()) {
@@ -326,4 +325,16 @@ public class FastDatePrinterTest {
             assertEquals(trial.three, printer.format(cal));
         }
     }
+    
+    @Test
+    public void testLang1103() throws ParseException {
+        Calendar cal = Calendar.getInstance(SWEDEN);
+        cal.set(Calendar.DAY_OF_MONTH, 2);
+
+        assertEquals("2", getInstance("d", SWEDEN).format(cal));
+        assertEquals("02", getInstance("dd", SWEDEN).format(cal));
+        assertEquals("002", getInstance("ddd", SWEDEN).format(cal));
+        assertEquals("0002", getInstance("dddd", SWEDEN).format(cal));
+        assertEquals("00002", getInstance("ddddd", SWEDEN).format(cal));
+    }
 }