A été posé cette question récemment et ne connaissait pas la réponse. À un niveau élevé, quelqu'un peut-il expliquer comment Java prend un caractère/une chaîne et le convertit en un int.
Merci beaucoup
Karl
Edit: Il serait également bon de savoir si d’autres langues font le même genre de chose.
Cela se fait généralement comme ceci:
Edit : Ceci fonctionne pour n’importe quelle base si vous remplacez 10 par la base correcte et ajustez l’obtention du chiffre du caractère correspondant (devrait fonctionner tel quel pour les bases inférieures à 10, mais nécessiterait un léger ajustement pour les bases supérieures - comme en hexadécimal - puisque les lettres sont séparées des chiffres par 7 caractères).
Édition 2 : Conversion de valeur de caractère à chiffre: les caractères '0' à '9' ont ASCII entre 48 et 57 (0x30 à 0x39 en hexa), afin de convertir un caractère en valeur numérique une simple soustraction est nécessaire. Cela se fait généralement comme ceci (où ord est la fonction qui donne le code ASCII du caractère):
digit = ord(char) - ord('0')
Pour les bases de nombres plus élevées, les lettres sont utilisées comme des «chiffres» (A à F en hexa), mais les lettres commencent à partir de 65 (0x41 hexa), ce qui signifie qu'il y a un espace que nous devons prendre en compte:
digit = ord(char) - ord('0')
if digit > 9 then digit -= 7
Exemple: 'B' vaut 66, donc ord ('B') - ord ('0') = 18. Comme 18 est supérieur à 9, nous soustrayons 7 et le résultat final sera 11 - la valeur du 'chiffre' B .
Une dernière chose à noter ici - cela ne fonctionne que pour les lettres majuscules, le nombre doit donc d'abord être converti en majuscule.
Le code source de l'API Java est disponible gratuitement. Voici la méthode parseInt (). Il est plutôt long car il doit gérer de nombreux cas exceptionnels et dans les virages.
public static int parseInt(String s, int radix)
throws NumberFormatException
{
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, max = s.length();
int limit;
int multmin;
int digit;
if (max > 0) {
if (s.charAt(0) == '-') {
negative = true;
limit = Integer.MIN_VALUE;
i++;
} else {
limit = -Integer.MAX_VALUE;
}
multmin = limit / radix;
if (i < max) {
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
} else {
result = -digit;
}
}
while (i < max) {
// 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);
}
if (negative) {
if (i > 1) {
return result;
} else { /* Only got "-" */
throw NumberFormatException.forInputString(s);
}
} else {
return -result;
}
}
Je ne suis pas sûr de ce que vous recherchez, en tant que "haut niveau". Je vais essayer:
total = (total x 10) + current
public class StringToInt {
public int ConvertStringToInt(String s) throws NumberFormatException
{
int num =0;
for(int i =0; i<s.length();i++)
{
if(((int)s.charAt(i)>=48)&&((int)s.charAt(i)<=59))
{
num = num*10+ ((int)s.charAt(i)-48);
}
else
{
throw new NumberFormatException();
}
}
return num;
}
public static void main(String[]args)
{
StringToInt obj = new StringToInt();
int i = obj.ConvertStringToInt("1234123");
System.out.println(i);
}
}
c'est ma simple implémentation de parse int
public static int parseInteger(String stringNumber) {
int sum=0;
int position=1;
for (int i = stringNumber.length()-1; i >= 0 ; i--) {
int number=stringNumber.charAt(i) - '0';
sum+=number*position;
position=position*10;
}
return sum;
}
Voici ce que je suis venu avec (Remarque: Aucune vérification n'est faite pour les alphabets)
int convertStringtoInt(String number){
int total =0;
double multiplier = Math.pow(10, number.length()-1);
for(int i=0;i<number.length();i++){
total = total + (int)multiplier*((int)number.charAt(i) -48);
multiplier/=10;
}
return total;
}