Skip to content

Commit 279d612

Browse files
authored
Merge pull request #2940 from jialeicui/master
Fixed overflow issue when handling large inputs in QuantityFormatter
2 parents 2622118 + 042e2f0 commit 279d612

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

kubernetes/src/main/java/io/kubernetes/client/custom/QuantityFormatter.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package io.kubernetes.client.custom;
1414

1515
import java.math.BigDecimal;
16+
import java.math.BigInteger;
1617
import java.math.MathContext;
1718
import org.apache.commons.lang3.tuple.Pair;
1819

@@ -64,43 +65,43 @@ private boolean isFractional(Quantity quantity) {
6465

6566
private String toBase1024String(final Quantity quantity) {
6667
final BigDecimal amount = quantity.getNumber();
67-
final long value = amount.unscaledValue().longValue();
68+
final BigInteger value = amount.unscaledValue();
6869
final int exponent = -amount.scale();
69-
final Pair<Long, Integer> resultAndTimes = removeFactorsForBase(value, 1024);
70+
final Pair<BigInteger, Integer> resultAndTimes = removeFactorsForBase(value, BigInteger.valueOf(1024));
7071
return resultAndTimes.getLeft()
7172
+ new SuffixFormatter()
7273
.format(quantity.getFormat(), exponent + resultAndTimes.getRight() * 10);
7374
}
7475

7576
private String toBase10String(final Quantity quantity) {
7677
final BigDecimal amount = quantity.getNumber();
77-
final long value = amount.unscaledValue().longValue();
78+
final BigInteger value = amount.unscaledValue();
7879
final int exponent = -amount.scale();
79-
final Pair<Long, Integer> resultAndTimes = removeFactorsForBase(value, 10);
80+
final Pair<BigInteger, Integer> resultAndTimes = removeFactorsForBase(value, BigInteger.TEN);
8081
final int postFactoringExponent = exponent + resultAndTimes.getRight();
81-
final Pair<Long, Integer> valueAndExponent =
82+
final Pair<BigInteger, Integer> valueAndExponent =
8283
ensureExponentIsMultipleOf3(resultAndTimes.getLeft(), postFactoringExponent);
8384
return valueAndExponent.getLeft()
8485
+ new SuffixFormatter().format(quantity.getFormat(), valueAndExponent.getRight());
8586
}
8687

87-
private Pair<Long, Integer> ensureExponentIsMultipleOf3(final long mantissa, final int exponent) {
88+
private Pair<BigInteger, Integer> ensureExponentIsMultipleOf3(final BigInteger mantissa, final int exponent) {
8889
final long exponentRemainder = exponent % 3;
8990
if (exponentRemainder == 1 || exponentRemainder == -2) {
90-
return Pair.of(mantissa * 10, exponent - 1);
91+
return Pair.of(mantissa.multiply(BigInteger.TEN), exponent - 1);
9192
} else if (exponentRemainder == -1 || exponentRemainder == 2) {
92-
return Pair.of(mantissa * 100, exponent - 2);
93+
return Pair.of(mantissa.multiply(BigInteger.valueOf(100)), exponent - 2);
9394
} else {
9495
return Pair.of(mantissa, exponent);
9596
}
9697
}
9798

98-
private Pair<Long, Integer> removeFactorsForBase(final long value, final int base) {
99+
private Pair<BigInteger, Integer> removeFactorsForBase(final BigInteger value, final BigInteger base) {
99100
int times = 0;
100-
long result = value;
101-
while (result >= base && result % base == 0) {
101+
BigInteger result = value;
102+
while (result.compareTo(base) >= 0 && result.mod(base).equals(BigInteger.ZERO)) {
102103
times++;
103-
result = result / base;
104+
result = result.divide(base);
104105
}
105106
return Pair.of(result, times);
106107
}

kubernetes/src/test/java/io/kubernetes/client/custom/QuantityFormatterTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,12 @@ public void testFormatNoExpDecimalExponent() {
179179
.format(new Quantity(BigDecimal.valueOf(12345), Quantity.Format.DECIMAL_EXPONENT));
180180
assertThat(formattedString, is("12345"));
181181
}
182+
183+
@Test
184+
public void testFormatLargeDecimalExponent() {
185+
final String formattedString2 =
186+
new QuantityFormatter()
187+
.format(new Quantity(Float.toString(123456789012.f)));
188+
assertThat(formattedString2, is("123456791e3"));
189+
}
182190
}

0 commit comments

Comments
 (0)