Javaで文字列をintに変換するにはどうすればよいですか?

2011年04月08日に質問されました。  ·  閲覧回数 6.1M回  ·  ソース

Unknown user picture
2011年04月08日

JavaでStringintに変換するにはどうすればよいですか?

文字列には数値のみが含まれているので、それが表す数値を返したいのですが。

たとえば、文字列"1234"すると、結果は数値1234ます。

回答

Rob Hruska picture
2011年04月08日
4188
String myString = "1234";
int foo = Integer.parseInt(myString);

Javaのドキュメントを見ると、「キャッチ」は、この関数がNumberFormatExceptionスローする可能性があることに気付くでしょう。もちろん、これを処理する必要があります。

int foo;
try {
   foo = Integer.parseInt(myString);
}
catch (NumberFormatException e)
{
   foo = 0;
}

(この処理では、デフォルトで不正な数値が0になりますが、必要に応じて別のことを行うことができます。)

または、GuavaライブラリのIntsメソッドを使用することもできます。これは、Java 8のOptionalと組み合わせて、文字列をintに変換する強力で簡潔な方法になります。

import com.google.common.primitives.Ints;

int foo = Optional.ofNullable(myString)
 .map(Ints::tryParse)
 .orElse(0)
lukastymo picture
2011年04月08日
706

たとえば、次の2つの方法があります。

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

これらの方法にはわずかな違いがあります。

  • valueOfは、 java.lang.Integer新しいインスタンスまたはキャッシュされたインスタンスを返します
  • parseIntはプリミティブint返します。

すべての場合に同じことが言えます: Short.valueOf / parseShortLong.valueOf / parseLongなど。

Ali Akdurak picture
2013年04月30日
248

考慮すべき非常に重要な点は、 Javadocに記載されているように整数パーサーが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.
}

分割引数から整数値を取得しようとしたり、何かを動的に解析したりする場合は、この例外を処理することが重要です。

Billz picture
2013年09月11日
85

手動で行う:

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;
}
Ryboflavin picture
2015年08月27日
55

代替ソリューションを使用することであるApacheのコモンズのNumberUtilsを:

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

文字列が無効な数値形式の場合、常に0が返されるため、Apacheユーティリティは便利です。 したがって、trycatchブロックを節約できます。

Apache NumberUtilsAPIバージョン3.4

Oak picture
2014年03月21日
43

現在、上記のような特定の表現が使えない大学の課題をやっていて、ASCIIテーブルを見るとなんとかできました。 これははるかに複雑なコードですが、私のように制限されている他の人を助けることができます。

最初に行うことは、入力(この場合は数字の文字列)を受け取ることです。 これをString numberと呼びます。この場合、番号12を使用して例示します。したがって、 String number = "12";

もう1つの制限は、繰り返しサイクルを使用できなかったため、 forサイクル(完璧だったはずです)も使用できないという事実でした。 これは私たちを少し制限しますが、それが目標です。 (最後の2桁を取る)2桁しか必要なかったので、単純な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;

さて、なぜ2倍になるのですか? まあ、本当に「奇妙な」ステップのために。 現在、1と2の2つのdoubleがありますが、12に変換する必要があります。実行できる数学演算はありません。

後者(最後の桁)を2/10 = 0.2 (したがって、なぜ2倍になるのか)のように10で除算します。

 lastdigit = lastdigit / 10;

これは単に数字で遊んでいるだけです。 最後の桁を小数に変換していました。 しかし今、何が起こるかを見てください:

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

数学に深く入り込むことなく、単に数値の桁を単位で分離しているだけです。 ご覧のとおり、0〜9のみを考慮しているため、10の倍数で割ると、それを保存する「ボックス」を作成するようなものになります(1年生の先生が1つの単位と100を説明したときを思い出してください)。 そう:

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

そして、あなたは行き​​ます。 次の制限を考慮して、数字の文字列(この場合は2桁)をこれらの2桁で構成される整数に変換しました。

  • 繰り返しサイクルなし
  • parseIntなどの「魔法の」式はありません
ROMANIA_engineer picture
2016年03月07日
38

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 intを取得したい場合は、次を使用できます。

  1. 開封:

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

    Integer.decode("12").intValue();
    
Stefan Dollase picture
2016年04月04日
29

指定された文字列に整数が含まれていない可能性がわずかにある場合は常に、この特殊なケースを処理する必要があります。 残念ながら、標準のJavaメソッドInteger::parseIntInteger::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 "12"
System.out.println(tryParseInteger("12").map(i -> i.toString()).orElse("invalid"));
// prints "-1"
System.out.println(tryParseInteger("-1").map(i -> i.toString()).orElse("invalid"));
// prints "invalid"
System.out.println(tryParseInteger("ab").map(i -> i.toString()).orElse("invalid"));

これはまだ内部でフロー制御の例外を使用していますが、使用法コードは非常にクリーンになります。 また、 -1が有効な値として解析される場合と、無効な文字列を解析できなかった場合を明確に区別できます。

Dmytro Shvechikov picture
2017年10月04日
25

それを行う方法:

  1. Integer.parseInt(s)
  2. Integer.parseInt(s, radix)
  3. Integer.parseInt(s, beginIndex, endIndex, radix)
  4. Integer.parseUnsignedInt(s)
  5. Integer.parseUnsignedInt(s, radix)
  6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
  7. Integer.valueOf(s)
  8. Integer.valueOf(s, radix)
  9. Integer.decode(s)
  10. NumberUtils.toInt(s)
  11. NumberUtils.toInt(s, defaultValue)

Integer.valueOfは、Integerオブジェクトと他のすべてのメソッドをプリミティブintとして生成します。

最後の2つの方法は、 commons-lang3と、ここでの変換に関する大きな記事からのもの

Dennis Ahaus picture
2013年10月20日
24

文字列をintに変換することは、単に数値を変換することよりも複雑です。 あなたは次の問題について考えました:

  • 文字列には0〜9の数字のみが含まれていますか?
  • 文字列の前後の-/ +はどうなっていますか? それは可能ですか(会計番号を参照)?
  • MAX _- / MIN_INFINITYはどうしたの? 文字列が99999999999999999999の場合はどうなりますか? マシンはこの文字列をintとして扱うことができますか?