Atoi в java, используя charAt

Я знаю, что одно решение для этого:

 String tmp = "12345";
      int result = 0;
      for (int i =0; i < tmp.length(); i++){
          char digit = (char)(tmp.charAt(i) - '0');
          result += (digit * Math.pow(10, (tmp.length() - i - 1)));

      }

      System.out.println(result);

Я не понимаю, почему:

char digit = (char)(tmp.charAt(i) - '0');

Как это преобразовать в цифру?

+5
07 нояб. '11 в 16:04
источник поделиться
8 ответов

char digit = (char) (tmp.charAt(i) - '0');

В таблице ascii символы от '0' до '9' являются смежными. Итак, если вы знаете, что tmp.charAt(i) вернет символ между 0 и 9, то отрыв 0 вернет смещение от нуля, то есть цифру, которую представляет этот символ.

+12
07 нояб. '11 в 16:08
источник

Использование Math.pow очень дорогое, вам будет лучше использовать Integer.parseInt.

Вам не нужно использовать Math.pow. Если ваши номера всегда положительные, вы можете сделать

int result = 0;
for (int i = 0; i < tmp.length(); i++)
   result = result * 10 + tmp.charAt(i) - '0';
+8
07 нояб. '11 в 16:13
источник

char - целочисленный тип, который отображает наши буквы в числа, которые компьютер может понять (см. диаграмму ascii). Строка - это всего лишь массив символов. Так как числа смежны в ascii-представлении, '1' - '0' = 49 - 48 = 1, '2' - '0' = 50 - 48 = 2 и т.д.

+7
07 нояб. '11 в 16:10
источник

Попробуйте следующее:

int number = Integer.parseInt("12345") 
// or 
Integer number = Integer.valueOf("12345") 

atoi может быть немного грязным для разработчиков. Java предпочитает более читаемые имена

+2
07 нояб. '11 в 16:09
источник

Java имеет встроенную функцию, которая делает это...

String s =  "12345";
Integer result = Integer.parseInt(s);
0
07 нояб. '11 в 16:08
источник

Я повторяю то, что сказал Том.

Если вы запутались с вышеприведенной реализацией, вы можете обратиться к более простой реализации.

private static int getDecValue(char hex) {
    int dec = 0;
    switch (hex) {
    case '0':
        dec = 0;
        break;
    case '1':
        dec = 1;
        break;
    case '2':
        dec = 2;
        break;
    case '3':
        dec = 3;
        break;
    case '4':
        dec = 4;
        break;
    case '5':
        dec = 5;
        break;
    case '6':
        dec = 6;
        break;
    case '7':
        dec = 7;
        break;
    case '8':
        dec = 8;
        break;
    case '9':
        dec = 9;
        break;
    default:
        // do nothing
    }
    return dec;
}

public static int atoi(String ascii) throws Exception {
    int integer = 0;
    for (int index = 0; index < ascii.length(); index++) {
        if (ascii.charAt(index) >= '0' && ascii.charAt(index) <= '9') {
            integer = (integer * 10) + getDecValue(ascii.charAt(index));
        } else {
            throw new Exception("Is not an Integer : " + ascii.charAt(index));
        }
    }
    return integer;
}
0
03 июл. '17 в 22:51
источник

Если вы используете Integer.parseInt, вам нужно поймать исключения, поскольку Integer.parseInt( "82.23" ) или Integer.parseInt( "ABC" ) запустит исключения.

Если вы хотите разрешить такие вещи, как

     atoi ("82.23") // => 82
     atoi ("AB123") // => 0

что имеет смысл, вы можете использовать

     public static int atoi (String sInt)
     {
        return (int) (atof (sInt));
     }

     public static long atol (String sLong)
     {
        return (long) (atof (sLong));
     }

     public static double atof (String sDob)
     {
        double reto = 0.;

        try {
           reto = Double.parseDouble(sDob);
        }
        catch (Exception e) {}

        return reto;
     }
0
26 мар. '16 в 14:31
источник

Если вы программируете на Java, используйте это,

int atoi(String str)
{
    try{
        return Integer.parseInt(str);
    }catch(NumberFormatException ex){
        return -1;   
    }
}
0
15 авг. '17 в 13:43
источник

Посмотрите другие вопросы по метке или Задайте вопрос