在java中,将任何数字字符串(int、float、double、long等)转换为适当的数字值(int、浮点、doub



在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()方法返回LongDouble包装对象,因此可以对其进行相应的检查和分配以供一般使用。这里唯一的问题是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);

最新更新