在java中,是否有更好的做法将任何输入数字字符串(int、double等)转换为其各自的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
,因此需要根据需求进行处理。
我用这个来解决我的问题,但很想知道其他解决方案!!
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"序列化为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);