为什么我们需要输入字符串,然后在可以输入整数时将它们解析为整数?

时间:2014-07-29 03:22:37

标签: java

这可能是一个非常基本的问题,但我真的不明白这样做的目的。相当疯狂地猜测可能是效率或表现,安全力量(我真的不明白目的)

2 个答案:

答案 0 :(得分:1)

好的,从技术上讲,从技术和文字的角度来看,你投入数值。但是,这些数值被定义为字符 - 字母,数字,符号,甚至一些非打印符号。

对于电脑来说,这都是数字。但是,它们有一种特殊的方式来表示数字结构,例如整数,或有理数/实数,等等。

你不能直接输入数字的主要原因是因为你输入的数字意味着另一种方式。您必须从任何编码(ASCII或UTF-8或其他编码)转换您的数字,并在适当的数字结构中赋予它值。

例如,字符'0'。它有一个48的代码点值(UTF-8和可能的ASCII)。如果我们在它的文字代码点值取'0',我们的数学结果就会变得很糟糕。

还有一种情况是你不只是把数字放入 - 你还要输入其他字母,符号,并且(如果你没有UTF-8,上帝帮助你)s̈̊̄ͯ̍ͤo̓̈̈-c̑̋a̅ll̑̓̒ͪͦ̚e̓ͭ̔̋̚d͛̄ͧͯ“ͬͭ͆Z̋̓̈̈a͗̇̑l͑̒ͣ̌̈̚g̋ͦ͑o͆̉̍ͮiͩ̽̌̾͆͛z̾̓ͯͭe̋ͪ͆̇ͪd̄ͫ” ̾ͮ̽̾ͮ̽C̑ͬ͒J̇̔ͤK̇ͩ̇͑c͒̈̾ȟ͌͒ͪͪa̽ͣ̑r̓͛͑̐ác̉ͨ̉͆͆ͦ̄tͮ̋̓̚eͧ̽͋ͬͮr͋͋͑ͩͦ̐̅sͯͬ͋͛ͬ!̓ͤ̌ͯͫ!̐̇ͫ!͒̏͆̌诚ͦ̓͛̉̚

同样,这些都是计算机的数字,但这些数字对计算机的意义与他们不同。

为了简单起见,用户对计算机的主要互动将是输入字符串,因为数字不能完全传达单词或短语,除非一个人专门讲话和阅读二进制文件(这将再次被翻译成其他可以阅读的文字)。

*:对于加法和减法,你的结果将会减去48,但这会使乘法和除法真的令人兴奋。


因此,如上所述,让我们举一个简单的例子:我们需要将输入“012817”转换为某种类型。我们假设基数为10(0到9)。

作为一台计算机,我认为这是:

48, 49, 50, 56, 49, 55

由于48将成为我们的零,我们可以有把握地说,每当我们遇到一个我们希望转换为实际数字的字符时,我们就会从中减去48。简单!

48 - 48, 49 - 48, 50 - 48, 56 - 48, 49 - 48, 55 - 48
0, 1, 2, 8, 1, 7

由于前导零在基数10中没有意义,因此它被丢弃,我们现在可以将它存储在数值结构中:

12817

那么如果输入非数字会发生什么?好吧,鉴于这些数字是连续的*,我们可以添加10到48,并且知道58是我们将遇到的最高基数10。这给了我们一个方便的属性 - 如果我们的角色和48之间的差异大于58,我们就不能将它放入数值结构中**。我们应该爆炸,抱怨和抱怨,并给用户这个友好的例外:

Exception in thread "main" java.lang.NumberFormatException: For input string: "A"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at com.stackoverflow.sandbox.Formatting.main(Formatting.java:19)

如果您使用的是基数16(0到9,以及A到F,不区分大小写),您可以在您允许的范围内留出更多余地。如果你知道“A”和“a”的开始位置(分别为65和97),你可以扩展你的转换算法以尊重包含字母A的任何一种情况的值,包括包括任何一种情况的值。字母F.

*:至少在ASCII和UTF-8中,它们是。其他数字系统的其他编码可能有所不同。

**:我们再次谈论基数10.更高的基数可能允许您添加更多字符,但这取决于您的转换算法。我故意简单地说明基础知识。

答案 1 :(得分:0)

如果您正在阅读用户输入,请使用Scanner对象。如果输入只是一个数字,你当然可以使用Scanner类的nextInt()方法读取它。但是,如果数字嵌入在其他非数字字符串中,则必须对其进行解析。命令行中的任何内容都被视为字符串,并通过String [] args参数传递给main方法。必须解析这些因为它们被认为嵌入在字符串中。另外,请记住字符串不是原始数据类型。它是一个带有大写“S”的String,因为它是Java中的对象级数据结构。因此,嵌入其中的数字字符不能作为基本整数处理。