0

是否有更好的做法将任何输入数字字符串(int、double 等)转换为 java 中各自的 Wrapper 对象/原始类型?

使用valueOf()parseXXX()方法可以实现。但在选择适当的类型之前,我应该知道底层的字符串格式。

我正在做的是将数字字符串解析为 long,使用NumberUtilsfrom commons-lang.jar如下:

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,所以需要根据要求进行处理。

我用它来解决我的问题,但很想知道任何其他解决方案!

4

2 回答 2

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会抛出 aNumberFormatException而不是默认为的变体0

于 2014-11-11T14:27:31.527 回答
0

我需要一种更复杂的方法,因为我希望将“1.0”序列化为双精度,而不是 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”的整数将转换为整数,否则为 Long。十进制数字将被转换为双精度数,除非它们以“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);
于 2016-02-11T09:44:42.620 回答