首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串转换为整数将向我抛出一个错误:(

将字符串转换为整数将向我抛出一个错误:(
EN

Stack Overflow用户
提问于 2016-03-18 21:13:59
回答 3查看 113关注 0票数 0

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

代码语言:javascript
复制
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);

        }
    }
}

以下是我所犯的错误:

代码语言:javascript
复制
========================
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)‘。为什么我还会收到这个错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-18 21:27:41

JLS : 4.2.1。积分类型和值

积分类型的值是以下范围内的整数: ..。

  • int,从-2147483648到2147483647,包括

您在这里超过了int值的限制

代码语言:javascript
复制
Integer.parseInt(card_string.trim());

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

代码语言:javascript
复制
BigInteger myBigNumber = new BigInteger(card_string.trim());

许多操作可以作为summultiply等.

来源:https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

另一个解决方案是使用long而不是int。它是有限的,但限制是相当高的,请看下面。

积分类型的值是以下范围内的整数: ..。 很长时间,从-9223372036854775808到9223372036854775807,包括

票数 2
EN

Stack Overflow用户

发布于 2016-03-18 21:21:22

int最大尺寸为2,147,483,647。你试图解析更大的数字,123412341,234。

您可以使用long而不是int

代码语言:javascript
复制
long card_number = Long.parseLong(card_string.trim());
票数 1
EN

Stack Overflow用户

发布于 2016-03-18 21:27:10

正如其他人所注意到的,您将得到此异常,因为卡号比int所表示的要大。

你看起来只是简单地把卡号的数字相加,显然是相反的(尽管只有当你在求和的时候打印一些东西时,这才是相关的)。

不需要将整个字符串解析为数字即可:

代码语言:javascript
复制
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,您可以更容易地(/naturally)做:

代码语言:javascript
复制
int sum = 0;
for (int i = 0; i < card_number.length(); ++i) {
  sum += Character.getNumericValue(card_number.charAt(i));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36094337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档