是否有更好的做法将任何输入数字字符串(int,double等)转换为它在java中的相应Wrapper对象/原语类型?
使用valueOf()
或parseXXX()
方法可以实现。但在选择合适的类型之前,我应该知道基础字符串格式。
我正在做的是使用 commons-lang.jar 中的NumberUtils
将数字字符串解析为long,如下所示:
long longValue= (long) NumberUtils.toLong(numberString);
但问题是如果numberString
的值为double
,则无法解析为数字,并将0.0
作为已解析的值返回。只有以下语句适用于双值:
Long longValue = (long) NumberUtils.toDouble(numberString);
有没有通用的方法呢?我也不在乎小数点后的数字。
感谢阅读。
更新
@Thomas建议,这看起来很优雅。
NumberFormat numberFormat = NumberFormat.getNumberInstance();
long longValue = numberFormat.parse(targetFieldValue).longValue();
当parse()
方法返回Long
或Double
包装器对象时,可以相应地检查和分配它以供通用使用。这里只有parse()
可以抛出ParseException
,因此需要根据要求进行处理。
我用它来解决我的问题,但很想知道任何其他解决方案!
答案 0 :(得分:0)
import static org.apache.commons.lang3.math.NumberUtils.isDigits;
import static org.apache.commons.lang3.math.NumberUtils.toDouble;
import static org.apache.commons.lang3.math.NumberUtils.toLong;
public static void main(String[] args) {
String numberString = "-23.56";
long longNumber = (isDigits(numberString) ? toLong(numberString) : (long) toDouble(numberString));
System.out.println(longNumber);
}
此处的演员假设您对截断小数而感到满意,无论sign
如何(字符串中-
的存在意味着isDigits
返回false
) 。如果没有,请进行适当的舍入。
如果您担心字符串可能包含字母表,请使用createLong
变体,该变体会引发NumberFormatException
而不是默认为0
。
答案 1 :(得分:0)
我需要一种更复杂的方法,因为我希望将“1.0”序列化为double,而不是作为int,所以我实现了自己的解决方案,并将其留给未来:
public Number deserialize(CharSequence text) {
Preconditions.checkArgument(Objects.requireNonNull(text).length() > 0);
switch (text.charAt(text.length() - 1)) {
case 'L':
return Long.parseLong(text.subSequence(0, text.length() - 1).toString());
case 'f':
return Float.parseFloat(text.toString());
default:
Number number = Ints.tryParse(text.toString());
if (number == null) {
number = Doubles.tryParse(text.toString());
}
if (number == null) {
throw new IllegalArgumentException("Unsupported number: " + text);
}
return number;
}
}
格式遵循Java中的格式,因此末尾没有“L”的整数将转换为整数,否则为Longs。十进制数字将被转换为双打,除非它们以'f'结尾,在这种情况下它们将被转换为浮点数。 以下测试正在通过:
EXPECT.that(deserialize("1")).isEqualTo(1);
EXPECT.that(deserialize("5L")).isEqualTo(5L);
EXPECT.that(deserialize("2.0")).isEqualTo(2.0);
EXPECT.that(deserialize("4.0f")).isEqualTo(4.0f);