Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,将任意数字字符串(int、float、double、long等)转换为适当的数值(int、float、double、long等)_Java_Apache Commons Lang - Fatal编程技术网

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

在java中,将任意数字字符串(int、float、double、long等)转换为适当的数值(int、float、double、long等),java,apache-commons-lang,Java,Apache Commons Lang,在java中,是否有更好的方法将任何输入数字字符串int、double等转换为相应的包装器对象/原语类型 使用valueOf或parseXXX方法可以实现。但是在选择合适的类型之前,我应该知道底层字符串格式 我正在使用commons-lang.jar中的NumberUtils将数字字符串解析为long,如下所示: long longValue= (long) NumberUtils.toLong(numberString); 但问题是,如果numberString有一个双精度值,那么它无法解析

在java中,是否有更好的方法将任何输入数字字符串int、double等转换为相应的包装器对象/原语类型

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

我正在使用commons-lang.jar中的NumberUtils将数字字符串解析为long,如下所示:

long longValue= (long) NumberUtils.toLong(numberString);
但问题是,如果numberString有一个双精度值,那么它无法解析为number,并将返回0.0作为解析值。只有以下语句适用于双值:

Long longValue = (long) NumberUtils.toDouble(numberString);
有没有一种通用的方法?我也不在乎小数点后的数字

谢谢你的阅读

更新

在我看来,这是@Thomas建议的优雅解决方案:

NumberFormat NumberFormat=NumberFormat.getNumberInstance; long longValue=numberFormat.parsetargetFieldValue.longValue

当parse方法返回Long或Double包装器对象时,可以相应地对其进行检查和分配,以供一般使用。这里唯一的问题是解析可能抛出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);
}
这里的强制转换假设您对截断小数感到满意,而不管字符串中的符号-表示isDigits返回false。如果没有,请进行适当的四舍五入


如果您担心字符串可能包含字母表,请使用createLong变量,该变量将抛出NumberFormatException,而不是默认为0。

我需要一种更复杂的方法,因为我希望1.0序列化为双精度,而不是整数,所以我实现了自己的解决方案,并将其留到将来使用:

公共编号反序列化字符序列文本{ Premissions.checkArgumentObjects.RequiredOnNullText.length>0; 开关text.charAttext.length-1{ 案例“L”: 返回Long.parseLongtext.subSequence0,text.length-1.toString; 案例“f”: 返回Float.parseFloattext.toString; 违约: Number=Ints.tryParsetext.toString; 如果数字==null{ number=Doubles.tryParsetext.toString; } 如果数字==null{ 抛出新的IllegalArgumentExceptionUnsupported数字:+text; } 返回号码; } } 该格式与Java中的格式相同,因此结尾不带“L”的整数将转换为整数,否则为长整数。十进制数字将转换为双精度数字,除非它们以“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);

如果您只需要long,那么只需按照您的方式将所有内容解析为double或float,因为它应该接受int、float、double等任何类型。。。那就投长吧。只要您的数字不超过最大双精度值,您就可以了…如果您需要特定的类型,具体取决于字符串,那么我将使用正则表达式…您可以使用DecimalFormatPass,默认设置应返回双精度浮点数和长整数。是否有更好的做法来转换任何输入数字字符串在java中,int、double等是它各自的包装器对象/原语类型。我想要的是接受一个数字字符串并将其解析为long。。是哪一个?这是两个不同的目标。@Diablo我恐怕还是很困惑。您想要一个针对所有数据类型的通用解决方案,还是只对创建长值感兴趣?一个潜在的问题是isDigits会为负数返回false,因此您会在长负值上调用toDouble。这不是比Long NumberRutils更优雅的解决方案。toDoublenumberString,是吗?也许,取决于你对优雅的定义;