尝试将字符串转换为Long然后分解每个数字

时间:2018-01-26 23:16:04

标签: java

我有一个作业,要求我从输入中请求一个12位数字(必须作为字符串)并计算出它的最后一位数字。但是,它会在digits[i] = temp%10;返回错误,说我无法执行此操作。有没有其他人有这方面的经验呢?

 import java.util.*;
 public class Exercise05_47{

 public static void main(String []args){
    Scanner sc = new Scanner(System.in);
    int[] digits;
    int d13 = 0;
    System.out.println("Enter the first 12 digits of an ISBN-13 as a string: ");
    String ISBN = sc.nextLine();
    Long realISBN = Long.parseLong(ISBN);
    Long temp = realISBN;
    Long ten = 10L;
    if(ISBN.length() != 12)
    {
        System.out.println(ISBN+" is an invalid input");
        return;

    }
    else 
    {
        for(int i=0;i<=12;i++)
        {
            digits[i] = temp%10 ;
            temp /=10;
        }
        d13 = 10-(digits[0]+3*digits[1]+digits[2]+3*digits[3]+digits[4]+3*digits[5]+digits[6]+3*digits[7]+digits[8]+3*digits[9]+digits[10]+3*digits[11])%10;
        if(d13 ==10)
        {
            d13=0;
        }

    }
    System.out.println("The ISBN-13 number is "+ISBN+d13);
   }
 }

1 个答案:

答案 0 :(得分:4)

您无法将Long(或long)存储到int[],因为长整数使用的字节数多于常规整数。这尤其意味着并非所有long值都可以表示为int。解决问题的一种方法是使用long[]代替。

从技术上讲,您也可以将ISBN解析为int,但通常ID总是很长,以支持非常多的值,有些ISBN实际上不适合int,因此我的回答(请参阅此wiki page,它会告诉您ISBN最多可以有13个数字,超过int最大容量约20亿个。)

您可以在this pagethis one上找到有关不同基元类型的值的大小和范围的一些信息,以获取更多详细信息。

然而,正如 Ilya Bursov 指出的那样,你的数组只包含数字,因此小于10.你可以在shortint中填入任何数字,因此,在这种情况下将long值转换为较小的基本类型是安全的,即(int) (temp % 10)