Java 将字符串转换为长字符串,无内置库

Java 将字符串转换为长字符串,无内置库,java,string,overflow,long-integer,Java,String,Overflow,Long Integer,我编写了Java代码来将String转换为long。然而,在处理溢出问题时,我没有解决它的线索。如果一个数字溢出,计算机会认为存储中的每个数字都是合法的如何让64位jdk程序检测到实数溢出是关键问题。我不允许使用任何内置库,如parseLong或其他库 public static long strTolong(String s){ //error checking if(s == null) return 0; s = s.trim();//rem

我编写了Java代码来将
String
转换为
long
。然而,在处理溢出问题时,我没有解决它的线索。如果一个数字溢出,计算机会认为存储中的每个数字都是合法的如何让64位jdk程序检测到实数溢出是关键问题。我不允许使用任何内置库,如parseLong或其他库

public static long strTolong(String s){
        //error checking
        if(s == null) return 0;
        s = s.trim();//remove all space character
        boolean neg = false;//judge the number is negative or positive
        int pos = 0 ; //index of string
        long result = 0;
        //check positive or negative
        if(s.charAt(pos) == '-'){
            neg = true;
            pos++;
        }else if(s.charAt(pos) == '+') pos++;

        //calculate result
        while(pos<s.length()){
            if(s.charAt(pos) >='0' && s.charAt(pos) <='9'){
                result = result*10+(s.charAt(pos) - '0');
            }else
                break;
            pos++;
        }
        if(neg) result =-result;

        //check overflow
        if(result >Long.MAX_VALUE) {
            return Long.MAX_VALUE;
        }
        if(result<Long.MIN_VALUE){
            return Long.MIN_VALUE;
        }


        return result;
    }
公共静态长strTolong(字符串s){
//错误检查
如果(s==null)返回0;
s=s.trim();//删除所有空格字符
boolean neg=false;//判断数字是负数还是正数
int pos=0;//字符串的索引
长结果=0;
//检查阳性或阴性
如果(s.charAt(位置)='-'){
负=真;
pos++;
}如果(s.charAt(pos)='+')pos++;
//计算结果
while(pos='0'和&s.charAt(pos)Long.MAX_值){
返回Long.MAX_值;
}

如果(结果你可以做与Long#parseLong相同的事情:

 throw new NumberFormatException("too long (pun intended): "+s);

您最好的选择可能是在开始之前对输入和最小/最大数字进行词典比较

static int compare(String v1, String v2) {
    boolean neg1 = v1.startsWith("-");
    boolean neg2 = v2.startsWith("-");
    return neg1 ? (neg2 ? -comparePositives(v1.substring(1),v2.substring(1)):-1)
                : (neg2 ? 1 : comparePositives(v1, v2));
}

static int comparePositives(String v1, String v2) {
    // Is one longer?
    if (v1.length() != v2.length())
        return v1.length() < v2.length() ? -1 : 1;

    // Both empty?
    if (v1.isEmpty())
        return 0;

    // First digit differs?
    if (v1.charAt(0) != v2.charAt(0))
        return v1.charAt(0) < v2.charAt(0) ? -1 : 1;

    // Recurse on rest of number
    return comparePositives(v1.substring(1), v2.substring(1));
}
此处测试:


请注意,代码没有检查输入是否格式正确。我建议您首先进行此类检查。(注意
0
-0
等情况)。

我不确定您在这里尝试实现什么。如果
String
大于
Long。MAX_值
表示不再是
Long

如果您的
字符串
值在
Long
范围内,则可以使用
Long.parseLong()
,而无需使用此类硬方法

如果你想拥有一个巨大的数字,你可以轻松地使用
BigDecimal

String max = Long.MAX_VALUE+"";
System.out.println(max);
long maxL=Long.parseLong(max)+1;
System.out.println(maxL);
BigDecimal bigDecimal=new BigDecimal(max).add(new BigDecimal("1"));
System.out.println(bigDecimal); 
输出:

9223372036854775807 // long max value
-9223372036854775808 // incorrect result in long
9223372036854775808 // BigDecimal gives you correct one

对于您的情况,如果值大于
Long.MAX\u value
或小于
Long.MIN\u value

Long.parseLong(“102”);
中的问题是什么?@aioobe是您想要说的吗?“如果字符串大于Long.MAX\u value意味着它不再是一个长值”--我相信OP知道这一点。他面临的问题是,他无法通过执行
result>Long.MAX_VALUE
检查溢出,因为
result
是一个长的。@RuchiraGayanRanaweera问题是计算机会相信溢出的数据是合法格式。我被允许使用Long.parseLong,因为这是内置的库。问题是is计算机不会注意到数据溢出。您的解决方案令人印象深刻。但是,这里使用的是内置库。正则表达式方式也是如此。关键问题是计算机不会注意到数据溢出。此解决方案也做同样的事情。
9223372036854775807 // long max value
-9223372036854775808 // incorrect result in long
9223372036854775808 // BigDecimal gives you correct one