Java,检测一个String是否超出Long类型的值边界

时间:2015-02-24 16:53:18

标签: java long-integer

考虑以下Java代码:

String columnValue = "188237574385834583453453635";
columnValue =(Long.parseLong(columnValue)>Long.MAX_VALUE?"0":columnValue);

它会抛出java.lang.NumberFormatException,因为输入值超出Long的最大值。但是,有一种简单的方法可以检测“字符串”类型中的数字是否超出Long的最大值而不使用try catch解决方案?

4 个答案:

答案 0 :(得分:8)

懒惰的方式可以是使用BigInteger

BigInteger a = new BigInteger("188237574385834583453453635");
BigInteger b = BigInteger.valueOf(Long.MAX_VALUE);

System.out.println("a > Long.MAX_VALUE is : " + (a.compareTo(b) > 0 ? "true" : "false"));

如果性能很重要,则必须测试更多解决方案。

@SotiriosDelimanolis的想法也很好:

  

提取parseLong的源代码,而不是抛出一个   异常,返回一个布尔值。

代码中还有很多throw,有些用于格式,有些用于溢出,你必须选择正确的。{/ p>

答案 1 :(得分:0)

一种非常俗气的方式:

columnValue.length() > ("" + Long.MAX_VALUE).length()

当然,这不包括大于Long.MAX_VALUE的值,但是数字位数相同,只有更多数字的值。

答案 2 :(得分:-1)

不是。

唯一天真的部分解决方案是比较字符串的长度,但这不会一直有效。

答案 3 :(得分:-1)

您可以创建一个实用程序方法来包装try / catch并返回一个布尔值,如:

import java.util.*;
import java.lang.*;
import java.io.*;

class TestClass
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(TestClass.isLongString("188237574385834583453453635"));
    }

    public static boolean isLongString(final String longNumber)
    {
        boolean isLong = false;
        try
        {
            Long.parseLong(longNumber);
            isLong = true;
        }
        catch(Exception e)
        {
            // do nothing - return default false
        }

        return isLong;
    }
}