8333396: Use StringBuilder internally for java.text.Format.* formatting

Reviewed-by: naoto, liach, jlu
This commit is contained in:
lingjun.cg 2024-07-22 02:01:08 +00:00
parent fd741a88e8
commit 4da9915875
16 changed files with 764 additions and 73 deletions

View file

@ -556,9 +556,9 @@ public class DecimalFormat extends NumberFormat {
((BigInteger)number).bitLength () < 64)) {
return format(((Number)number).longValue(), toAppendTo, pos);
} else if (number instanceof BigDecimal) {
return format((BigDecimal)number, toAppendTo, pos);
return format((BigDecimal)number, StringBufFactory.of(toAppendTo), pos).asStringBuffer();
} else if (number instanceof BigInteger) {
return format((BigInteger)number, toAppendTo, pos);
return format((BigInteger)number, StringBufFactory.of(toAppendTo), pos).asStringBuffer();
} else if (number instanceof Number) {
return format(((Number)number).doubleValue(), toAppendTo, pos);
} else {
@ -566,6 +566,28 @@ public class DecimalFormat extends NumberFormat {
}
}
@Override
final StringBuf format(Object number,
StringBuf toAppendTo,
FieldPosition pos) {
if (number instanceof Long || number instanceof Integer ||
number instanceof Short || number instanceof Byte ||
number instanceof AtomicInteger ||
number instanceof AtomicLong ||
(number instanceof BigInteger &&
((BigInteger) number).bitLength() < 64)) {
return format(((Number) number).longValue(), toAppendTo, pos);
} else if (number instanceof BigDecimal) {
return format((BigDecimal) number, toAppendTo, pos);
} else if (number instanceof BigInteger) {
return format((BigInteger) number, toAppendTo, pos);
} else if (number instanceof Number) {
return format(((Number) number).doubleValue(), toAppendTo, pos);
} else {
throw new IllegalArgumentException("Cannot format given Object as a Number");
}
}
/**
* Formats a double to produce a string.
* @param number The double to format
@ -588,6 +610,12 @@ public class DecimalFormat extends NumberFormat {
@Override
public StringBuffer format(double number, StringBuffer result,
FieldPosition fieldPosition) {
return format(number, StringBufFactory.of(result), fieldPosition).asStringBuffer();
}
@Override
StringBuf format(double number, StringBuf result,
FieldPosition fieldPosition) {
// If fieldPosition is a DontCareFieldPosition instance we can
// try to go to fast-path code.
boolean tryFastPath = false;
@ -619,8 +647,8 @@ public class DecimalFormat extends NumberFormat {
* mode being set to RoundingMode.UNNECESSARY
* @return The formatted number string
*/
StringBuffer format(double number, StringBuffer result,
FieldDelegate delegate) {
StringBuf format(double number, StringBuf result,
FieldDelegate delegate) {
boolean nanOrInfinity = handleNaN(number, result, delegate);
if (nanOrInfinity) {
@ -666,7 +694,7 @@ public class DecimalFormat extends NumberFormat {
* @param delegate notified of locations of sub fields
* @return true, if number is a NaN; false otherwise
*/
boolean handleNaN(double number, StringBuffer result,
boolean handleNaN(double number, StringBuf result,
FieldDelegate delegate) {
if (Double.isNaN(number)
|| (Double.isInfinite(number) && multiplier == 0)) {
@ -691,7 +719,7 @@ public class DecimalFormat extends NumberFormat {
* @return true, if number is a {@code Double.NEGATIVE_INFINITY} or
* {@code Double.POSITIVE_INFINITY}; false otherwise
*/
boolean handleInfinity(double number, StringBuffer result,
boolean handleInfinity(double number, StringBuf result,
FieldDelegate delegate, boolean isNegative) {
if (Double.isInfinite(number)) {
if (isNegative) {
@ -720,7 +748,7 @@ public class DecimalFormat extends NumberFormat {
return false;
}
StringBuffer doubleSubformat(double number, StringBuffer result,
StringBuf doubleSubformat(double number, StringBuf result,
FieldDelegate delegate, boolean isNegative) {
synchronized (digitList) {
int maxIntDigits = super.getMaximumIntegerDigits();
@ -761,6 +789,14 @@ public class DecimalFormat extends NumberFormat {
fieldPosition.setBeginIndex(0);
fieldPosition.setEndIndex(0);
return format(number, StringBufFactory.of(result), fieldPosition.getFieldDelegate()).asStringBuffer();
}
StringBuf format(long number, StringBuf result,
FieldPosition fieldPosition) {
fieldPosition.setBeginIndex(0);
fieldPosition.setEndIndex(0);
return format(number, result, fieldPosition.getFieldDelegate());
}
@ -774,8 +810,8 @@ public class DecimalFormat extends NumberFormat {
* mode being set to RoundingMode.UNNECESSARY
* @see java.text.FieldPosition
*/
StringBuffer format(long number, StringBuffer result,
FieldDelegate delegate) {
StringBuf format(long number, StringBuf result,
FieldDelegate delegate) {
boolean isNegative = (number < 0);
if (isNegative) {
number = -number;
@ -849,8 +885,8 @@ public class DecimalFormat extends NumberFormat {
* mode being set to RoundingMode.UNNECESSARY
* @see java.text.FieldPosition
*/
private StringBuffer format(BigDecimal number, StringBuffer result,
FieldPosition fieldPosition) {
private StringBuf format(BigDecimal number, StringBuf result,
FieldPosition fieldPosition) {
fieldPosition.setBeginIndex(0);
fieldPosition.setEndIndex(0);
return format(number, result, fieldPosition.getFieldDelegate());
@ -865,8 +901,8 @@ public class DecimalFormat extends NumberFormat {
* mode being set to RoundingMode.UNNECESSARY
* @return The formatted number string
*/
StringBuffer format(BigDecimal number, StringBuffer result,
FieldDelegate delegate) {
StringBuf format(BigDecimal number, StringBuf result,
FieldDelegate delegate) {
if (multiplier != 1) {
number = number.multiply(getBigDecimalMultiplier());
}
@ -908,8 +944,8 @@ public class DecimalFormat extends NumberFormat {
* mode being set to RoundingMode.UNNECESSARY
* @see java.text.FieldPosition
*/
private StringBuffer format(BigInteger number, StringBuffer result,
FieldPosition fieldPosition) {
private StringBuf format(BigInteger number, StringBuf result,
FieldPosition fieldPosition) {
fieldPosition.setBeginIndex(0);
fieldPosition.setEndIndex(0);
@ -926,8 +962,8 @@ public class DecimalFormat extends NumberFormat {
* mode being set to RoundingMode.UNNECESSARY
* @see java.text.FieldPosition
*/
StringBuffer format(BigInteger number, StringBuffer result,
FieldDelegate delegate, boolean formatLong) {
StringBuf format(BigInteger number, StringBuf result,
FieldDelegate delegate, boolean formatLong) {
if (multiplier != 1) {
number = number.multiply(getBigIntegerMultiplier());
}
@ -986,7 +1022,7 @@ public class DecimalFormat extends NumberFormat {
public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
CharacterIteratorFieldDelegate delegate =
new CharacterIteratorFieldDelegate();
StringBuffer sb = new StringBuffer();
StringBuf sb = StringBufFactory.of();
if (obj instanceof Double || obj instanceof Float) {
format(((Number)obj).doubleValue(), sb, delegate);
@ -1779,7 +1815,7 @@ public class DecimalFormat extends NumberFormat {
* Complete the formatting of a finite number. On entry, the digitList must
* be filled in with the correct digits.
*/
private StringBuffer subformat(StringBuffer result, FieldDelegate delegate,
private StringBuf subformat(StringBuf result, FieldDelegate delegate,
boolean isNegative, boolean isInteger,
int maxIntDigits, int minIntDigits,
int maxFraDigits, int minFraDigits) {
@ -1821,7 +1857,7 @@ public class DecimalFormat extends NumberFormat {
* @param maxFraDigits maximum fraction digits
* @param minFraDigits minimum fraction digits
*/
void subformatNumber(StringBuffer result, FieldDelegate delegate,
void subformatNumber(StringBuf result, FieldDelegate delegate,
boolean isNegative, boolean isInteger,
int maxIntDigits, int minIntDigits,
int maxFraDigits, int minFraDigits) {
@ -2108,7 +2144,7 @@ public class DecimalFormat extends NumberFormat {
* <p>
* This is used by {@code subformat} to add the prefix/suffix.
*/
private void append(StringBuffer result, String string,
private void append(StringBuf result, String string,
FieldDelegate delegate,
FieldPosition[] positions,
Format.Field signAttribute) {