Питання Як перетворити рядок на int в Java?


Як я можу конвертувати a String до int в Java?

Мій рядок містить лише числа, і я хочу повернути число, яке він представляє.

Наприклад, задано рядок "1234" в результаті має бути номер 1234.


2520
2018-04-07 18:27


походження




Відповіді:


String myString = "1234";
int foo = Integer.parseInt(myString);

Див Документація Java для отримання додаткової інформації.


3557
2018-04-07 18:29



Це буде кинути NumberFormatException якщо введення не є дійсним номером. - Francesco Menzani
На додаток до лову NumberFormatException, користувач також повинен бути обережним щодо довжини рядків, які вони передають; якщо вони достатньо довгі, щоб переповнити ціле число, вони, можливо, захочуть замість цього використовувати Long :: parseLong. - Allison
@Allison, особливо, якщо використовується поле BIGINT у додатковому полі для початкового ключа PostgreSQL. Набагато безпечніше використовувати довго - Letholdrus
Ви можете перевірити, чи є рядок першим: stackoverflow.com/questions/1102891/... - JPRLCol
Цей метод також викидає виняток, коли рядок не є цілим числом, що піддається аналізу в базі 10. Використовуйте перевантажений метод для роботи в інших базах. наприклад, Integer.parseInt ("1001", 8); для бази 8 Джерело. - lokesh


Наприклад, тут є два шляхи:

Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);

Існує невелика різниця між цими методами:

  • valueOf повертає новий або кешований екземпляр java.lang.Integer
  • parseInt повертає примітиву int.

Те саме стосується всіх випадків: Short.valueOf/parseShort, Long.valueOf/parseLongі т. д.


588
2018-04-07 18:36



Для відмінностей між двома способами див це питання - hertzsprung
valueOf метод просто return valueOf(parseInt(string)); - Paul Verest


Що ж, дуже важливим моментом є те, що аналізатор Integer викидає NumberFormatException як зазначено в Джавадок.

int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
      //Will Throw exception!
      //do something! anything to handle the exception.
}

try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
      //No problem this time, but still it is good practice to care about exceptions.
      //Never trust user input :)
      //Do something! Anything to handle the exception.
}

Важливо звертатися до цього винятку, коли намагається отримати цілі значення від розщеплених аргументів або щось динамічне розбору.


215
2018-04-30 06:54



як я можу проаналізувати "26263Hello"? Я хочу отримати 26263 в цьому випадку - user463035818
@ user463035818 - Див docs.oracle.com/javase/8/docs/api/java/util/regex/... - регулярна виразність моделі "([0-9]+)" "захопить" першу послідовність однієї або більше цифр від одного до дев'яти. Подивись на Matcher клас у цьому пакеті. - Mark Stewart


Зробіть це вручну:

public static int strToInt( String str ){
    int i = 0;
    int num = 0;
    boolean isNeg = false;

    //Check for negative sign; if it's there, set the isNeg flag
    if (str.charAt(0) == '-') {
        isNeg = true;
        i = 1;
    }

    //Process each character of the string;
    while( i < str.length()) {
        num *= 10;
        num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
    }

    if (isNeg)
        num = -num;
    return num;
}

72
2017-09-11 02:08



Що робити, якщо вхідні дані перевищують 2 ^ 32? Що робити, якщо вхід містить нечисленні символи? - yohm
Одна з речей, яку програміст повинен навчитися приєднуватися до робочої сили, якщо не раніше, ніколи не буде повторно винаходити колеса. Це може бути веселою фізичною активністю, але не очікуйте, що ваш код перевірятиме код, якщо ви зробите таку справу в комерційній обстановці. - Dawood ibn Kareem
@yohm це особливий випадок; ви можете обробляти довгий і деякий регулярний вираз; однак, до того часу ви можете використовувати parseInt. - Billz
-1 Вибачте, але це доволі поганий алгоритм, що має безліч обмежень, без обробки помилок та деяких дивних аномалій (наприклад, "" дає виняток, "-" буде виробляти 0, а "+" видає -5). Чому б кожен не вибрав це Integer.parseInt(s)? - Я бачу точку зору про те, що це питання є співбесідою, але а) це не означає, що ти зробиш це таким чином (це те, про що запитував запитання), і б) ця відповідь досить поганий приклад у будь-якому випадку. - SusanW
Я думаю, ця відповідь для цікавих хлопців ... - Timur Milovanov


В даний час я виконую завдання в коледжі, де я не можу використовувати певні вирази, такі як вище, і переглянувши таблицю ASCII, мені вдалося це зробити. Це набагато більш складний код, але це може допомогти іншим, яким було обмежено.

Перше, що потрібно зробити - це отримати вхід, в цьому випадку, рядок цифр; Я це називаю String number, і в цьому випадку я покажу це з використанням номера 12, отже String number = "12";

Іншим обмеженням було те, що я не міг використовувати повторювані цикли, отже, a for Цикл (який був би ідеальним) також не може бути використаний. Це обмежує нас трохи, але знову ж таки це мета. Оскільки мені потрібно було лише дві цифри (з двох останніх цифр), просто charAtвирішив це:

 // Obtaining the integer values of the char 1 and 2 in ASCII
 int semilastdigitASCII = number.charAt(number.length()-2);
 int lastdigitASCII = number.charAt(number.length()-1);

Маючи коди, ми просто повинні шукати за столом і внести необхідні коригування:

 double semilastdigit = semilastdigitASCII - 48;  //A quick look, and -48 is the key
 double lastdigit = lastdigitASCII - 48;

Тепер, чому подвійне? Ну, через дійсно "дивний" крок. В даний час у нас є два подвійні, 1 і 2, але ми повинні перетворити його на 12, немає ніяких математичних операцій, які ми можемо зробити.

Ми розділяємо останні (lastdigit) на 10 на моді 2/10 = 0.2 (отже, чому подвійне), як це:

 lastdigit = lastdigit/10;

Це просто гра з числами. Ми повернули останню цифру у десяткове. Але тепер подивіться, що відбувається:

 double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2

Не потрапляючи в математику, ми просто виділяємо одиниці цифрами числа. Ви бачите, оскільки ми розглядаємо лише 0-9, розділяючи кілька десятками, це схоже на створення "коробки", де ви його зберігаєте (згадайте, коли ваш перший вчитель класу пояснив вам, що таке одиниця і сотня). Так:

 int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"

І там ти йдеш. Ви перетворили рядок цифр (у цьому випадку, дві цифри) у ціле число, що складається з цих двох цифр, з урахуванням наступних обмежень:

  • Немає повторюваних циклів
  • Немає "магічних" виразів, таких як parseInt

38
2018-03-20 23:51



Використання типу double для розбору цілого числа - це не тільки погана ідея ефективності. Цінності, такі як 0.2, є періодичними числами у представленні з плаваючою комою і не можуть бути точно відображені. Спробуйте System.out.println (0,1 + 0,2), щоб побачити точку - результат не буде 0,3! Краще дотримуйтесь коду бібліотеки, скільки завгодно, в цьому випадку Integer.parseInt (). - ChrisB
Не зрозуміло, яка проблема ця відповідь намагається вирішити, по-перше, чому кожен повинен мати це обмеження, яке ви опишете, по-друге, чому ви повинні переглянути таблицю ASCII, оскільки ви можете просто використовувати '0' за символ замість 48 і ніколи не доведеться турбуватися з його фактичним числовим значенням. По-третє, весь обхід з double цінність взагалі не має сенсу, оскільки ви розділяєте десять, просто множимо десятьма пізніше. Результат просто є semilastdigit * 10 + lastdigit як навчився в початковій школі, коли запроваджено десяткову систему ... - Holger
@Holger Я особисто дав це обмеження при першому запуску програмування, а також коли мені доводилося писати (перо / папір) подібні взаємодії в тесті. Це рідкість, але це метод, який легко зрозуміти, і, незважаючи на те, що він не є найбільш ефективним на відстань, це метод, який працює досить пристойно для малих проектів. SO.SE призначений для того, щоб допомогти кожному, а не декільком. Я запропонував альтернативний метод для тих, хто починає, вивчаючи, як створити псевдо-алгоритм і перетворити його в алгоритм, а не використовувати premade java-вирази. Хоча я забув, що '0' круто - Oak


Альтернативним рішенням є використання Apache Commons Кількість номерів:

int num = NumberUtils.toInt("1234");

Утиліта Apache хороша, тому що якщо рядок є неправильним форматом, тоді завжди повертається 0. Зберігаючи вас, спробуйте спробувати зловити блок.

Apache NumberUtils API Версія 3.4


33
2017-08-27 12:07



Ви рідко бажаєте, щоб 0 використовувався при розбитті недійсного номера. - wnoise
Нуль - це те, що java використовує за замовчуванням, якщо не вказано поле int на об'єкті. Тому в цьому сенсі це має сенс. - Ryboflavin
@Рибофлавін Ні, це не так. Один з них - це чітко визначена мовна семантика, а інша - виключення - etherous


Integer.decode

Ви також можете використовувати public static Integer decode(String nm) throws NumberFormatException.

Він також працює для баз 8 і 16:

// base 10
Integer.parseInt("12");     // 12 - int
Integer.valueOf("12");      // 12 - Integer
Integer.decode("12");       // 12 - Integer
// base 8
// 10 (0,1,...,7,10,11,12)
Integer.parseInt("12", 8);  // 10 - int
Integer.valueOf("12", 8);   // 10 - Integer
Integer.decode("012");      // 10 - Integer
// base 16
// 18 (0,1,...,F,10,11,12)
Integer.parseInt("12",16);  // 18 - int
Integer.valueOf("12",16);   // 18 - Integer
Integer.decode("#12");      // 18 - Integer
Integer.decode("0x12");     // 18 - Integer
Integer.decode("0X12");     // 18 - Integer
// base 2
Integer.parseInt("11",2);   // 3 - int
Integer.valueOf("11",2);    // 3 - Integer

Якщо ти хочеш отримати int замість Integer ви можете використовувати:

  1. Розпакування:

    int val = Integer.decode("12"); 
    
  2. intValue():

    Integer.decode("12").intValue();
    

27
2018-03-07 00:42



Нарешті! Хтось справді турбує публікувати результати / виходи переходів! Чи можете ви також додати деякі символи "-"? - not2qubit


Кожного разу, коли існує найменша можливість того, що дана рядок не містить цілого числа, ви повинні розглянути цей особливий випадок. На жаль, стандартні методи Java Integer::parseInt і Integer::valueOf кинути а NumberFormatException щоб сигналізувати цей особливий випадок. Таким чином, ви маєте використовувати винятки для керування потоком, який зазвичай вважається поганим стилем кодування.

На мій погляд, ця особлива справа повинна розглядатися, повернувши а Optional<Integer>. Оскільки Java не пропонує такого методу, я використовую наступну обгортку:

private Optional<Integer> tryParseInteger(String string) {
    try {
        return Optional.of(Integer.valueOf(string));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

Використання:

// prints 1234
System.out.println(tryParseInteger("1234").orElse(-1));
// prints -1
System.out.println(tryParseInteger("foobar").orElse(-1));

Хоча воно все ще використовує винятки для контролю потоку всередині, код використання стає дуже чистим.


20
2018-04-04 03:13





Перетворення рядка до int більш складне, ніж просто перетворити число. Ви думаєте про такі проблеми:

  • Чи містить рядок лише номери 0-9?
  • У чому справа? - / + до чи після рядка? Чи можливо це (посилаючись на бухгалтерські цифри)?
  • У чому справа? MAX _- / MIN_INFINITY? Що буде, якщо рядок 99999999999999999999? Чи може машина розглядати цей рядок як int?

19
2017-10-20 13:18



Так - і є неприємний край справа навколо -2 ^ 31. Якщо ви спробуєте заперечувати 2 ^ 31, ви можете зіткнутися з труднощами ...... - SusanW


Ми можемо використовувати parseInt(String str) метод Integer обгортковий клас для перетворення значення "Строка" у ціле значення.

Наприклад:

String strValue = "12345";
Integer intValue = Integer.parseInt(strVal);

The Integer клас також надає valueOf(String str) спосіб:

String strValue = "12345";
Integer intValue = Integer.valueOf(strValue);

Ми можемо також використовувати toInt(String strValue) від NumberUtils Utility Class для конверсії:

String strValue = "12345";
Integer intValue = NumberUtils.toInt(strValue);

18
2017-10-20 09:51