Merge branch 'master' of

https://git-wip-us.apache.org/repos/asf/commons-lang.git

Conflicts:
	src/changes/changes.xml
This commit is contained in:
Gary Gregory 2016-07-28 22:43:48 -07:00
commit 697329630f
2 changed files with 60 additions and 16 deletions

View File

@ -46,7 +46,6 @@ The <action> type attribute can be add,update,fix,remove.
<body>
<release version="3.5" date="tba" description="tba">
<action issue="LANG-1253" type="add" dev="ggregory" due-to="adilek">[GitHub issue #170] Add RandomUtils#nextBoolean() method</action>
<action issue="LANG-1247" type="update" dev="chas" due-to="Benoit Wiart">FastDatePrinter generates extra Date objects</action>
<action issue="LANG-1018" type="fix" dev="pschumacher" due-to="Nick Manley">Fix precision loss on NumberUtils.createNumber(String)</action>
<action issue="LANG-1229" type="update" dev="pschumacher" due-to="Ruslan Cheremin">HashCodeBuilder.append(Object,Object) is too big to be inlined, which prevents whole builder to be scalarized</action>

View File

@ -684,23 +684,68 @@ public class FastDatePrinter implements DatePrinter, Serializable {
* @param value the value to append digits from.
*/
private static void appendFullDigits(final Appendable buffer, int value, int minFieldWidth) throws IOException {
// build up decimal representation in reverse
char[] work = new char[MAX_DIGITS];
int digit = 0;
while(value!=0) {
work[digit++] = (char)(value % 10 + '0');
value = value / 10;
}
// specialized paths for 1 to 4 digits -> avoid the memory allocation from the temporary work array
// see LANG-1248
if (value < 10000) {
// less memory allocation path works for four digits or less
// pad with zeros
while(digit<minFieldWidth) {
buffer.append('0');
--minFieldWidth;
}
int nDigits = 4;
if (value < 1000) {
--nDigits;
if (value < 100) {
--nDigits;
if (value < 10) {
--nDigits;
}
}
}
// left zero pad
for (int i = minFieldWidth - nDigits; i > 0; --i) {
buffer.append('0');
}
// reverse
while(--digit>=0) {
buffer.append(work[digit]);
switch (nDigits) {
case 4:
buffer.append((char) (value / 1000 + '0'));
value %= 1000;
case 3:
if (value >= 100) {
buffer.append((char) (value / 100 + '0'));
value %= 100;
} else {
buffer.append('0');
}
case 2:
if (value >= 10) {
buffer.append((char) (value / 10 + '0'));
value %= 10;
} else {
buffer.append('0');
}
case 1:
buffer.append((char) (value + '0'));
}
} else {
// more memory allocation path works for any digits
// build up decimal representation in reverse
char[] work = new char[MAX_DIGITS];
int digit = 0;
while (value != 0) {
work[digit++] = (char) (value % 10 + '0');
value = value / 10;
}
// pad with zeros
while (digit < minFieldWidth) {
buffer.append('0');
--minFieldWidth;
}
// reverse
while (--digit >= 0) {
buffer.append(work[digit]);
}
}
}