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

时间:2014-11-11 14:10:27

标签: java apache-commons-lang

是否有更好的做法将任何输入数字字符串(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()方法返回LongDouble包装器对象时,可以相应地检查和分配它以供通用使用。这里只有parse()可以抛出ParseException,因此需要根据要求进行处理。

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

2 个答案:

答案 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);