Created
June 16, 2016 17:59
-
-
Save semperos/a3f70edef653b37bb79b69df2781cd21 to your computer and use it in GitHub Desktop.
parseInt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Parses the string argument as a signed integer in the radix | |
* specified by the second argument. The characters in the string | |
* must all be digits of the specified radix (as determined by | |
* whether {@link java.lang.Character#digit(char, int)} returns a | |
* nonnegative value), except that the first character may be an | |
* ASCII minus sign {@code '-'} ({@code '\u005Cu002D'}) to | |
* indicate a negative value or an ASCII plus sign {@code '+'} | |
* ({@code '\u005Cu002B'}) to indicate a positive value. The | |
* resulting integer value is returned. | |
* | |
* <p>An exception of type {@code NumberFormatException} is | |
* thrown if any of the following situations occurs: | |
* <ul> | |
* <li>The first argument is {@code null} or is a string of | |
* length zero. | |
* | |
* <li>The radix is either smaller than | |
* {@link java.lang.Character#MIN_RADIX} or | |
* larger than {@link java.lang.Character#MAX_RADIX}. | |
* | |
* <li>Any character of the string is not a digit of the specified | |
* radix, except that the first character may be a minus sign | |
* {@code '-'} ({@code '\u005Cu002D'}) or plus sign | |
* {@code '+'} ({@code '\u005Cu002B'}) provided that the | |
* string is longer than length 1. | |
* | |
* <li>The value represented by the string is not a value of type | |
* {@code int}. | |
* </ul> | |
* | |
* <p>Examples: | |
* <blockquote><pre> | |
* parseInt("0", 10) returns 0 | |
* parseInt("473", 10) returns 473 | |
* parseInt("+42", 10) returns 42 | |
* parseInt("-0", 10) returns 0 | |
* parseInt("-FF", 16) returns -255 | |
* parseInt("1100110", 2) returns 102 | |
* parseInt("2147483647", 10) returns 2147483647 | |
* parseInt("-2147483648", 10) returns -2147483648 | |
* parseInt("2147483648", 10) throws a NumberFormatException | |
* parseInt("99", 8) throws a NumberFormatException | |
* parseInt("Kona", 10) throws a NumberFormatException | |
* parseInt("Kona", 27) returns 411787 | |
* </pre></blockquote> | |
* | |
* @param s the {@code String} containing the integer | |
* representation to be parsed | |
* @param radix the radix to be used while parsing {@code s}. | |
* @return the integer represented by the string argument in the | |
* specified radix. | |
* @exception NumberFormatException if the {@code String} | |
* does not contain a parsable {@code int}. | |
*/ | |
public static int parseInt(String s, int radix) | |
throws NumberFormatException | |
{ | |
/* | |
* WARNING: This method may be invoked early during VM initialization | |
* before IntegerCache is initialized. Care must be taken to not use | |
* the valueOf method. | |
*/ | |
if (s == null) { | |
throw new NumberFormatException("null"); | |
} | |
if (radix < Character.MIN_RADIX) { | |
throw new NumberFormatException("radix " + radix + | |
" less than Character.MIN_RADIX"); | |
} | |
if (radix > Character.MAX_RADIX) { | |
throw new NumberFormatException("radix " + radix + | |
" greater than Character.MAX_RADIX"); | |
} | |
int result = 0; | |
boolean negative = false; | |
int i = 0, len = s.length(); | |
int limit = -Integer.MAX_VALUE; | |
int multmin; | |
int digit; | |
if (len > 0) { | |
char firstChar = s.charAt(0); | |
if (firstChar < '0') { // Possible leading "+" or "-" | |
if (firstChar == '-') { | |
negative = true; | |
limit = Integer.MIN_VALUE; | |
} else if (firstChar != '+') | |
throw NumberFormatException.forInputString(s); | |
if (len == 1) // Cannot have lone "+" or "-" | |
throw NumberFormatException.forInputString(s); | |
i++; | |
} | |
multmin = limit / radix; | |
while (i < len) { | |
// Accumulating negatively avoids surprises near MAX_VALUE | |
digit = Character.digit(s.charAt(i++),radix); | |
if (digit < 0) { | |
throw NumberFormatException.forInputString(s); | |
} | |
if (result < multmin) { | |
throw NumberFormatException.forInputString(s); | |
} | |
result *= radix; | |
if (result < limit + digit) { | |
throw NumberFormatException.forInputString(s); | |
} | |
result -= digit; | |
} | |
} else { | |
throw NumberFormatException.forInputString(s); | |
} | |
return negative ? result : -result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment