Javaで数値と文字列を変換する方法まとめ|parseInt・valueOf・toStringの違いまで解説

目次

1. Javaで数値と文字列を変換する基本知識

Javaで開発していると、「数値なのに文字列として扱われているデータ」や「文字列で受け取った値を数値として計算したい場面」に必ず出会います。たとえば、フォーム入力・CSV読み込み・APIレスポンス・ログ出力などは、見た目が数字でも中身は文字列であることが珍しくありません。
このセクションでは、変換の必要性と、初心者がつまずきやすいポイントを整理します。

1.1 なぜ変換が必要になるのか

Javaのプログラムは、データの種類(型)を明確に扱います。ところが現実のデータの入口・出口は、次のように「文字列」になりがちです。

  • ユーザー入力:テキストボックスに「123」と入力しても、プログラムが受け取るのは基本的に文字列
  • ファイル(CSV / JSON / 設定ファイル):読み込むと文字列として取得されることが多い
  • HTTP/API:多くの値が文字列として渡ってくる(あるいはJSONの型が曖昧なこともある)
  • 表示やログ:数値をそのまま出すより、文字列にして整形して出力することが多い

このため、実務では次の2方向の変換が頻出します。

  • 数値 → 文字列:画面表示・ログ・メッセージ・連結など
  • 文字列 → 数値:計算・比較・範囲チェック・集計など

ここで重要なのは、**見た目が数字でも「型が違えば別物」**ということです。

  • "10"(文字列)と 10(数値)は同じに見えても、プログラム上は別の型
  • 文字列 "10" + "2""102"(連結)
  • 数値 10 + 212(加算)

「足し算したつもりが文字列連結になっていた」などのミスは、この違いを意識していないと起きやすいです。

1.2 Javaは「型」に厳しい言語

Javaは静的型付け言語なので、基本的に 型が合わない処理はコンパイルエラーになります。これは安全性の面ではメリットですが、文字列と数値のように違う型を行き来する場合、適切な変換が必要になります。

たとえば、文字列で受け取った入力を、そのまま数値として使おうとするとエラーになります。

  • 文字列 "123"int として計算したい
    int に変換してから使う必要がある

また、Javaには「プリミティブ型」と「ラッパークラス」という2種類の数値型があり、これが混乱ポイントになります。

  • プリミティブ型:int, long, double など(軽量・基本の数値)
  • ラッパークラス:Integer, Long, Double など(オブジェクトとして扱える数値)

たとえば Integer.valueOf("123") の戻り値は Integer(オブジェクト)Integer.parseInt("123") の戻り値は **int(プリミティブ)**です。
この違いは次のセクションで詳しく扱いますが、「同じ変換に見えても戻り値が違う」点が、初心者が迷いやすいところです。

1.3 自動変換と明示的変換の違い

「変換」と聞くと、Javaが自動でうまくやってくれるイメージを持つかもしれません。実際、一部は自動で変換されたように見える挙動があります。

代表例が 文字列連結です。

  • "合計: " + 10 のように書くと、10は自動で文字列に変換されたように見える

ただしこれは便利な一方で、意図しない結果を生む原因にもなります。

  • "10" + 2"102"(数値の加算ではなく、文字列の連結)

このように、Javaには「暗黙的に文字列化されるケース」はありますが、文字列 → 数値は基本的に自動で変換されません。
つまり、

  • 数値 → 文字列:状況によっては暗黙的に起きる(連結など)
  • 文字列 → 数値:必ず明示的な変換が必要(parseInt など)

と覚えておくと安全です。

また、文字列から数値に変換する際は、入力が常に正しいとは限りません。

  • 空文字 ""
  • スペース " 123 "
  • カンマ入り "1,000"
  • 小数 "12.34"int に変換しようとする
  • 数字以外 "12a"

こうしたケースでは、実行時に例外(代表的には NumberFormatException)が発生します。
「変換できない入力が来る前提」で設計するのが、現場ではとても重要です。

2. 数値 → 文字列に変換する方法

このセクションでは、Javaで数値を文字列に変換する代表的な方法を、使い分けの考え方とあわせて解説します。
ログ出力・画面表示・メッセージ作成など、実務で最もよく使われる変換です。

2.1 String.valueOf() を使う方法(最も一般的)

数値を文字列に変換する方法として、最も無難で推奨されるのが String.valueOf() です。

int i = 100;
String s = String.valueOf(i);

int だけでなく、longdoublefloatboolean など、ほぼすべてのプリミティブ型に対応しています。

double d = 12.34;
String s = String.valueOf(d);

この方法の大きな特徴は以下の点です。

  • 書き方が統一されていて覚えやすい
  • プリミティブ型・ラッパークラスの両方に対応
  • 可読性が高い
  • 意図が明確(「文字列に変換している」と一目で分かる)

また、ラッパークラスのオブジェクトを渡した場合でも、安全に文字列化できます。

Integer num = null;
String s = String.valueOf(num); // "null"

null を渡しても NullPointerException が発生しない点は、ログ出力などでは特に便利です。

2.2 Integer.toString() / Double.toString() を使う方法

各数値型のラッパークラスには、toString() メソッドが用意されています。

int i = 100;
String s = Integer.toString(i);
double d = 12.34;
String s = Double.toString(d);

この方法も正しく動作しますが、次のような特徴があります。

  • 型ごとにメソッドが異なる(Integer / Double / Long など)
  • すべて覚えるのはやや面倒
  • String.valueOf() より汎用性が低い

そのため、特定の型だけを明示的に扱いたい場合を除き、実務では String.valueOf() の方が使われることが多いです。

2.3 オブジェクトの toString() を使う場合の注意点

ラッパークラスや自作クラスのオブジェクトに対して、toString() を直接呼ぶ方法もあります。

Integer i = 100;
String s = i.toString();

これは問題なく動作しますが、null の可能性がある場合は注意が必要です。

Integer i = null;
String s = i.toString(); // NullPointerException

このように、オブジェクトが null の場合は実行時エラーになります。
安全性を考えると、次のような場面では String.valueOf() の方が向いています。

  • ログ出力
  • デバッグ用文字列生成
  • nullが混ざる可能性がある処理

2.4 「+ “”」による変換は使うべきか?

次のようなコードを見たことがあるかもしれません。

int i = 100;
String s = i + "";

確かに、これは数値を文字列に変換します。しかし、推奨される方法ではありません

理由は以下の通りです。

  • 一見して意図が分かりにくい
  • 「連結なのか変換なのか」が曖昧
  • コードレビュー時に嫌われやすい
  • 将来的な修正時に誤解を生みやすい

短いサンプルコードや一時的な検証では使われることがありますが、保守性を考えると避けるのが無難です。

2.5 数値 → 文字列変換の使い分けまとめ

数値を文字列に変換する場合、次のように覚えておくと実務で迷いません。

  • 基本は String.valueOf()
  • 型を明示したい場合は Integer.toString() / Double.toString()
  • オブジェクトに対する toString() は null に注意
  • + “” は原則使わない

3. 文字列 → 数値に変換する方法

ここからは、実務で特に重要な 文字列を数値に変換する方法 を解説します。
ユーザー入力や外部データは想定どおりの値が来るとは限らないため、変換方法と注意点を正しく理解しておくことが不可欠です。

3.1 Integer.parseInt() を使う方法(最も基本)

文字列を int に変換する代表的な方法が Integer.parseInt() です。

String s = "123";
int i = Integer.parseInt(s);

このメソッドは、戻り値がプリミティブ型の int になります。
計算や比較をすぐに行いたい場合に向いています。

int total = Integer.parseInt("10") + Integer.parseInt("20");
// total は 30

ただし、次のような文字列を渡すと 実行時に例外が発生します。

  • "abc"
  • ""(空文字)
  • "12.3"(小数)
  • "1,000"(カンマ付き)
int i = Integer.parseInt("abc"); // NumberFormatException

この例外はコンパイル時には検出されず、実行時に発生するため注意が必要です。

3.2 Integer.valueOf() を使う方法

Integer.valueOf() も、文字列を数値に変換する代表的な方法です。

String s = "123";
Integer i = Integer.valueOf(s);

parseInt() との最大の違いは、戻り値が Integer(ラッパークラス)である点です。

  • parseInt()int
  • valueOf()Integer

この違いは、次のような場面で意味を持ちます。

  • コレクション(List / Map)に格納したい
  • nullを扱う設計にしている
  • オブジェクトとして扱いたい

内部的には、valueOf() も数値変換に失敗すると NumberFormatException を投げます。
つまり、「エラーになりにくい」という違いはありません。

3.3 parseInt と valueOf の使い分け

どちらを使えばよいか迷った場合は、次の基準で考えると分かりやすいです。

  • 計算や比較が目的 → parseInt()
  • オブジェクトとして扱いたい → valueOf()

最近のJavaではオートボクシングがあるため、実際の差は小さくなっていますが、戻り値の型を意識して選ぶ習慣は大切です。

3.4 double / long など他の数値型への変換

整数以外にも、文字列を他の数値型に変換するケースは多くあります。

long l = Long.parseLong("100000");
double d = Double.parseDouble("12.34");

基本的なルールは共通です。

  • Long.parseLong()long
  • Double.parseDouble()double
  • Float.parseFloat()float

いずれも、変換できない文字列を渡すと NumberFormatException が発生します。

特に注意したいのが、小数を整数型に変換しようとした場合です。

int i = Integer.parseInt("12.34"); // 例外

この場合は、最初から double として扱う設計にする必要があります。

3.5 前後の空白に注意する

ユーザー入力などでは、意図せず空白が含まれることがあります。

String s = " 123 ";
int i = Integer.parseInt(s); // 例外

このような場合は、変換前に trim() を使うのが一般的です。

int i = Integer.parseInt(s.trim());

ただし、trim() をしても数値以外の文字が含まれていれば例外は発生します。

3.6 文字列 → 数値変換のポイントまとめ

文字列を数値に変換する際は、次の点を意識すると安全です。

  • 外部入力は必ず疑う
  • 例外が発生する前提で設計する
  • 型(int / long / double)を明確に決める
  • 必要に応じて前処理(trimなど)を行う

4. BigDecimal・BigIntegerを使った変換(金融・計算用途)

ここまで紹介してきた intdouble は便利ですが、計算精度が重要な場面では注意が必要です。
特に金額・数量・割合などを扱う場合、誤差の問題を避けるために BigDecimalBigInteger が使われます。

4.1 なぜ double では不十分なのか

double は浮動小数点数のため、内部的に 2進数で近似表現されています。
その結果、次のような現象が起こります。

double d = 0.1 + 0.2;
System.out.println(d); // 0.30000000000000004

これはバグではなく、仕様です。
表示上は些細に見えますが、以下のような処理では致命的になる可能性があります。

  • 金額計算
  • 請求・精算処理
  • 利率・割合の累積計算

このような場面では、誤差が出ない型を使う必要があります。

4.2 BigDecimal を使った文字列 → 数値変換

BigDecimal は、文字列から生成するのが原則です。

BigDecimal bd = new BigDecimal("12.34");

ここで注意したいのが、次の書き方です。

BigDecimal bd = new BigDecimal(12.34); // 非推奨

この場合、元の double にすでに誤差が含まれているため、BigDecimal にしても誤差を引き継いでしまいます。

必ず String から生成すると覚えてください。

4.3 数値 → 文字列への変換(BigDecimal)

BigDecimal を文字列に変換する場合は、toString() を使うのが一般的です。

BigDecimal bd = new BigDecimal("12.3400");
String s = bd.toString(); // "12.3400"

表示用にフォーマットしたい場合は、DecimalFormat などを使いますが、
内部処理と表示処理は分けて考えるのが基本です。

4.4 BigInteger を使うケース

BigInteger は、非常に大きな整数を扱うためのクラスです。

BigInteger bi = new BigInteger("12345678901234567890");

次のような場面で使われます。

  • 桁数が非常に大きい数値
  • IDやハッシュ値の数値表現
  • 通常の long を超える整数計算

一般的な業務アプリでは出番は少なめですが、「上限が読めない整数」を扱う場合には有効です。

4.5 BigDecimal / BigInteger 使用時の考え方まとめ

  • 金額・精度重視 → BigDecimal
  • 巨大な整数 → BigInteger
  • BigDecimal は 必ず String から生成
  • 表示用の整形は別処理にする

5. 変換時に発生しやすいエラーと対処法

文字列から数値へ変換する処理では、必ずエラーが起きる可能性があると考える必要があります。
このセクションでは、代表的な例外と、その安全な対処方法を整理します。

5.1 NumberFormatException とは何か

NumberFormatException は、文字列を数値として解釈できなかった場合に発生する実行時例外です。

int i = Integer.parseInt("abc"); // NumberFormatException

この例外はコンパイル時には検出されず、実行して初めて発生します。
そのため、入力値が外部由来の場合(フォーム・ファイル・APIなど)、必ず考慮しなければなりません。

よくある原因は次の通りです。

  • 数字以外の文字が含まれている
  • 空文字、null
  • 小数を整数型に変換しようとしている
  • カンマや記号が含まれている(例:”1,000″)

5.2 try-catch を使った基本的な対処法

最も基本的な対処法は、try-catch を使って例外を捕捉する方法です。

try {
    int i = Integer.parseInt(input);
} catch (NumberFormatException e) {
    // 変換失敗時の処理
}

この方法のポイントは以下です。

  • 異常系を確実に処理できる
  • 変換失敗時の挙動を明示できる
  • 実務で最も多く使われる

ログ出力やエラーメッセージ表示などと組み合わせることで、安全な処理が可能になります。

5.3 事前チェックで例外を防ぐ考え方

例外処理とは別に、事前に数値かどうかを判定する方法もあります。

boolean isNumber = input.matches("\\d+");

このような正規表現を使えば、数字のみかどうかを判定できます。ただし、この方法には注意点もあります。

  • 小数や負数に対応しづらい
  • 書き方が複雑になりがち
  • 完全な保証にはならない

そのため、最終的な安全策としては try-catch が必要と考えるのが現実的です。

5.4 null と空文字の扱いに注意する

数値変換前には、null や空文字のチェックを行うことが重要です。

if (input == null || input.isEmpty()) {
    // エラー処理
}

このチェックをせずに変換を行うと、例外や想定外の挙動につながります。
特にフォーム入力や設定ファイルでは、空文字が頻繁に発生します。

5.5 エラー処理の考え方まとめ

  • 外部入力は必ず失敗する前提で扱う
  • try-catch で確実に例外を捕捉する
  • 事前チェックは補助的に使う
  • null・空文字を最初に除外する

6. 用途別おすすめ変換方法まとめ

ここまでで、Javaにおける数値と文字列の変換方法を一通り見てきました。
このセクションでは、実際の開発現場で迷わないための「用途別の考え方」を整理します。

6.1 画面表示・ログ出力の場合

画面表示やログ出力では、安全性と可読性が最優先です。

おすすめの方法は次の通りです。

  • 数値 → 文字列:String.valueOf()
  • オブジェクトの可能性がある場合も String.valueOf() を使う
log.info("count=" + String.valueOf(count));

null が混ざる可能性があっても、例外を起こさず処理できる点がメリットです。

6.2 計算・比較が目的の場合

計算や比較を行う場合は、できるだけ早く数値型に変換するのが基本です。

  • 文字列 → 数値:parseInt() / parseLong() / parseDouble()
  • 変換後は数値型で処理を完結させる
int price = Integer.parseInt(inputPrice);
int total = price * quantity;

文字列のまま処理を続けると、思わぬバグの原因になります。

6.3 フォーム入力・外部データ処理の場合

ユーザー入力や外部データは、必ず不正な値が来る前提で扱います。

  • null / 空文字チェック
  • try-catch による例外処理
  • 必要に応じてエラーメッセージを返す
try {
    int age = Integer.parseInt(input);
} catch (NumberFormatException e) {
    // 入力エラー処理
}

「正常系だけを書く」のは避け、異常系を先に考えるのが実務的です。

6.4 金額・精度が重要な処理の場合

金額や割合など、誤差が許されない処理では BigDecimal を使います。

  • 文字列 → BigDecimal:new BigDecimal(String)
  • 表示と計算は分離する
BigDecimal amount = new BigDecimal(inputAmount);

double を経由しないことが最大のポイントです。

6.5 コレクションやオブジェクトとして扱う場合

List や Map に格納する場合や、null を扱う設計の場合は、ラッパークラスが向いています。

  • Integer.valueOf()
  • Long.valueOf()
List<Integer> list = new ArrayList<>();
list.add(Integer.valueOf("10"));

6.6 用途別まとめ

用途ごとの考え方をまとめると、次のようになります。

  • 表示・ログ → String.valueOf()
  • 計算 → parseXxx()
  • 金額・精度 → BigDecimal
  • 外部入力 → 例外処理前提
  • コレクション → valueOf()

7. よくある間違い・アンチパターン

数値と文字列の変換は基本的な処理ですが、初心者だけでなく経験者でもやりがちなミスがあります。
このセクションでは、実務で避けたい代表的なアンチパターンを整理します。

7.1 文字列のまま計算しようとする

次のようなコードは、一見正しそうに見えて危険です。

String a = "10";
String b = "20";
String result = a + b; // "1020"

これは計算ではなく、文字列の連結です。
数値計算を行う場合は、必ず数値型に変換してから処理します。

int result = Integer.parseInt(a) + Integer.parseInt(b); // 30

7.2 「+ “”」による変換を多用する

String s = value + "";

この書き方は動作しますが、意図が分かりにくく、保守性が低いためおすすめできません。

  • コードレビューで指摘されやすい
  • 後から読む人が混乱しやすい
  • 変換なのか連結なのかが曖昧

明示的に String.valueOf() を使う方が安全です。

7.3 BigDecimal に double を直接渡す

BigDecimal bd = new BigDecimal(0.1); // 非推奨

この書き方は、すでに誤差を含んだ double をそのまま使ってしまうため危険です。

正しい書き方は次の通りです。

BigDecimal bd = new BigDecimal("0.1");

金額や精度が重要な処理では、必ず文字列から生成します。

7.4 例外が起きない前提でコードを書く

int i = Integer.parseInt(input);

入力が常に正しいという前提は、実務ではほぼ成り立ちません。
外部入力を扱う場合は、必ず例外処理を組み込みます。

try {
    int i = Integer.parseInt(input);
} catch (NumberFormatException e) {
    // エラー処理
}

7.5 型の違いを意識しないまま使う

intIntegerdoubleBigDecimal など、型の違いを意識せずに使うのもよくあるミスです。

  • 計算が目的なのか
  • 表示が目的なのか
  • 精度が重要なのか

目的に応じて型を選ぶことが、バグを防ぐ近道です。

8. まとめ

Javaにおける数値と文字列の変換は、日常的に使われる一方で、小さなミスが大きな不具合につながりやすい処理でもあります。

この記事で押さえておきたいポイントは次の通りです。

  • 数値 → 文字列は String.valueOf() が基本
  • 文字列 → 数値は parseXxx() / valueOf() を使い分ける
  • 外部入力は必ず例外が起きる前提で扱う
  • 金額や精度が重要な処理では BigDecimal を使う
  • 曖昧な書き方(+ "" など)は避ける

変換方法を「暗記」するよりも、用途と型を意識して選ぶことが重要です。
この考え方を身につけておけば、Javaの基礎処理で迷うことは大きく減るでしょう。

9. よくある質問(FAQ)

ここでは、「java 数値 文字列 変換」で検索する読者が特につまずきやすいポイントを、Q&A形式で整理します。
本文を読んだあとに疑問が残りやすい点を補完する位置づけです。

Q1. Javaで数値を文字列に変換する一番おすすめの方法は何ですか?

基本的には String.valueOf() を使うのが最もおすすめです。

理由は以下の通りです。

  • 書き方が統一されていて分かりやすい
  • プリミティブ型・ラッパークラスの両方に対応
  • null を渡しても例外が発生しない
String s = String.valueOf(100);

実務ではこの方法を基準に考えると失敗しにくくなります。

Q2. parseInt と valueOf はどちらを使えば良いですか?

戻り値の型で選びます。

  • Integer.parseInt()int(プリミティブ型)
  • Integer.valueOf()Integer(ラッパークラス)

計算が目的なら parseInt()
コレクションに入れる・オブジェクトとして扱うなら valueOf() が向いています。

Q3. 文字列が数値かどうかを事前に判定する方法はありますか?

簡易的には正規表現で判定できます。

boolean isNumber = input.matches("\\d+");

ただし、この方法には次のような制限があります。

  • 小数・負数の対応が難しい
  • 完全な安全性は保証できない

そのため、最終的には try-catch による例外処理が必要と考えるのが現実的です。

Q4. 数値変換で NumberFormatException が出るのはなぜですか?

NumberFormatException は、文字列を数値として解釈できない場合に発生します。

よくある原因は以下です。

  • 数字以外の文字が含まれている
  • 空文字、null
  • 小数を整数型に変換しようとしている
  • カンマや記号が含まれている

外部入力を扱う場合は、必ず例外が発生する前提で設計しましょう。

Q5. 金額計算で double を使ってはいけないのはなぜですか?

double は内部的に2進数で近似表現されるため、誤差が必ず発生する可能性があります。

double d = 0.1 + 0.2; // 0.30000000000000004

金額・割合・精度が重要な処理では、BigDecimal を文字列から生成して使うのが正解です。

BigDecimal bd = new BigDecimal("0.1");

Q6. フォーム入力値を数値に変換するときの注意点は?

次の点を必ず意識してください。

  • null / 空文字チェックを行う
  • try-catch で例外を捕捉する
  • エラー時の挙動を明確にする

ユーザー入力は「正しくない前提」で扱うことが、バグ防止の基本です。

Q7. 文字列に変換したときの表示形式を制御したい場合は?

数値変換と表示整形は分けて考えます。

  • 変換:String.valueOf()BigDecimal
  • 表示:DecimalFormat などで整形

内部処理と表示処理を混ぜないことで、保守性が高くなります。