将字符串转换为整数会给我带来错误:(

时间:2016-03-18 21:14:00

标签: java

我试图将字符串转换为整数,如下所示:

import java.util.Scanner;
import java.lang.*;
public class Assignment4
{
    public static void main(String[] args)
    {
        // introduce program
        System.out.println("\n========================");
        System.out.println("Card Number Verification");
        System.out.println("========================\n");
        System.out.println("Enter 16 digit card number (no spaces): ");

        Scanner sc = new Scanner(System.in); // initialize scanner

        // intialize any relevant variables
        int sum = 0; // sum for all digits in card number
        int new_card_number; // relevant variable

        String card_string = sc.nextLine(); //get users card number
        int length = card_string.length(); // get length of number

        // verify that it is 16 numeric characters
        if (length != 16 || card_string.matches("\\d+") == false)       
        {   
            System.out.println("Restart the program and enter a valid card    number.");
            System.exit(0);
        }
        int card_number = Integer.parseInt(card_string.trim());
        new_card_number = card_number; // ensures card_number doesnt change
        while (length > 0)
        {
            sum = sum + (new_card_number % 10);
            new_card_number = (new_card_number - (new_card_number % 10)) / 10;
            length--;
            System.out.println(new_card_number + sum);

        }
    }
}

并且说明了我得到的错误:

========================
Card Number Verification
========================

Enter 16 digit card number (no spaces): 
1234123412341234
Exception in thread "main" java.lang.NumberFormatException: For input string: "1234123412341234"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:461)
    at java.lang.Integer.parseInt(Integer.java:499)
    at Assignment4.main(Assignment4.java:28)

我尝试使用trim选项或直接输入字符串变量为'Integer.parseInt(card_string)'。为什么我仍然收到此错误?

3 个答案:

答案 0 :(得分:2)

JLS : 4.2.1. Integral Types and Values

  

整数类型的值是以下范围内的整数:

     

[...]

     
      
  • 对于int,从-2147483648到2147483647,包括
  •   

您超过此处的int值限制

Integer.parseInt(card_string.trim());

一个很好的解决方案是在使用非常大的数字时使用BigInteger

BigInteger myBigNumber = new BigInteger(card_string.trim());

许多操作可能是summultiply等......

来源: BigInteger JavaDoc

另一种解决方案是使用long代替int。它是有限的,但限制很高,请在下面查看。

  

整数类型的值是以下范围内的整数:

     

[...]

     

很长一段时间,从-9223372036854775808到9223372036854775807,包括在内

答案 1 :(得分:1)

int最大尺寸为2,147,483,647。您正在尝试解析更大的数字1,234,123,412,341,234。

您可以使用long代替int

long card_number = Long.parseLong(card_string.trim());

答案 2 :(得分:1)

正如其他人所说,您收到此例外是因为卡号比int表示的号码大。

你似乎只是将卡号的数字相加,显然是反向的(尽管只有在你总结的时候打印出来才有用)。

您不需要将整个字符串解析为数字来执行此操作:

int sum = 0;
for (int i = card_number.length() - 1; i >= 0; --i) {
  sum += Character.getNumericValue(card_number.charAt(i));
  System.out.println(card_number.substring(0, i) + sum);
}

(请注意,trim是不必要的,因为您已经检查过它只是数字)

如果没有println,您可以更轻松地(/自然地)执行:

int sum = 0;
for (int i = 0; i < card_number.length(); ++i) {
  sum += Character.getNumericValue(card_number.charAt(i));
}