Refactor NumberToDataSizeConverter to use DataSize.ofBytes(long) directly

Prior to this commit, a `Number` was converted to a `String` and then
the string was parsed/matched using regular expressions back into a
suitable `long` which was inefficient and also prevented valid data
size values such as 10.0.

To address those issues, this commit refactors
NumberToDataSizeConverter to use DataSize.ofBytes(long) directly, first
checking that the supplied Number does not have a fractional part.

Closes gh-36956

Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
This commit is contained in:
Yanming Zhou
2026-06-23 12:19:27 +02:00
committed by Sam Brannen
parent 0cdb0cfae4
commit c35e17b038
2 changed files with 13 additions and 2 deletions
@@ -23,15 +23,20 @@ import org.springframework.util.unit.DataSize;
* Converts from a {@link Number} to a {@link DataSize}.
*
* @author YeongJae Min
* @author Yanming Zhou
* @since 7.1
* @see DataSize#parse(CharSequence)
* @see DataSize#ofBytes(long)
* @see StringToDataSizeConverter
*/
final class NumberToDataSizeConverter implements Converter<Number, DataSize> {
@Override
public DataSize convert(Number source) {
return DataSize.parse(source.toString());
long bytes = source.longValue();
if (source.doubleValue() - bytes != 0) {
throw new IllegalArgumentException("'" + source + "' is not a valid data size");
}
return DataSize.ofBytes(bytes);
}
}
@@ -76,6 +76,8 @@ import static org.assertj.core.api.Assertions.entry;
* @author Juergen Hoeller
* @author Stephane Nicoll
* @author Sam Brannen
* @author YeongJae Min
* @author Yanming Zhou
*/
class DefaultConversionServiceTests {
@@ -258,12 +260,16 @@ class DefaultConversionServiceTests {
void numberToDataSizeWithDecimalNumber() {
assertThatExceptionOfType(ConversionFailedException.class)
.isThrownBy(() -> conversionService.convert(10.5, DataSize.class));
assertThatExceptionOfType(ConversionFailedException.class)
.isThrownBy(() -> conversionService.convert(new BigDecimal("10.5"), DataSize.class));
}
@Test // gh-36830
void numberToDataSize() {
assertThat(conversionService.convert(10, DataSize.class)).isEqualTo(DataSize.ofBytes(10));
assertThat(conversionService.convert(-10L, DataSize.class)).isEqualTo(DataSize.ofBytes(-10));
assertThat(conversionService.convert(new BigDecimal("10"), DataSize.class)).isEqualTo(DataSize.ofBytes(10));
assertThat(conversionService.convert(new BigDecimal("10.0"), DataSize.class)).isEqualTo(DataSize.ofBytes(10));
}
@Test