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));
+ }
}