Flutterアプリ開発中に「Unhandled Exception: FormatException: Invalid double」エラーに遭遇した経験はありませんか?このエラーは、文字列を数値型(特に浮動小数点数)に変換しようとした際に、無効な形式の文字列が渡された場合に発生します。本記事では、このエラーの原因と解決方法について詳しく解説します。

エラーの原因

このエラーは主に以下の状況で発生します:

1. 空の文字列を数値に変換しようとした場合

2. 数値以外の文字(アルファベットや特殊文字)を含む文字列を変換しようとした場合

3. ロケールの違いによる小数点の表記の違い(例:「.」と「,」)

解決方法

1. null チェックの実装

String? input = ''; // または null
double? result;

if (input != null && input.isNotEmpty) {
  result = double.tryParse(input);
}

`double.tryParse()`を使用すると、変換に失敗した場合は`null`が返されるため、安全に変換を試みることができます。

2. デフォルト値の設定

String input = ''; // または不正な値
double result = double.tryParse(input) ?? 0.0;

`??`演算子を使用して、変換に失敗した場合のデフォルト値を設定できます。

3. 例外処理の実装

try {
  double result = double.parse(input);
} on FormatException catch (e) {
  print('変換エラー: $e');
  // エラーハンドリングのコードをここに記述
}

`try-catch`ブロックを使用して、例外を捕捉し適切に処理することができます。

4. 入力値の前処理

String input = '1,234.56';
String sanitizedInput = input.replaceAll(',', '');
double result = double.parse(sanitizedInput);

入力値に不要な文字が含まれている場合は、`replaceAll()`などのメソッドを使用して前処理を行うことができます。

5. ローカライゼーションの考慮

import 'package:intl/intl.dart';

String input = '1,234.56';
NumberFormat format = NumberFormat.decimalPattern('en_US');
double result = format.parse(input).toDouble();

`intl`パッケージを使用して、特定のロケールに応じた数値解析を行うことができます。

まとめ

「Unhandled Exception: FormatException: Invalid double」エラーは、適切な入力検証と例外処理を実装することで回避できます。上記の方法を組み合わせることで、より堅牢なコードを作成し、ユーザー体験を向上させることができます。

Flutterアプリ開発において、このようなエラー処理は非常に重要です。適切なエラーハンドリングを実装することで、アプリのクラッシュを防ぎ、ユーザーに適切なフィードバックを提供することができます。また、デバッグ時にも問題の原因を特定しやすくなります。

最後に、常に入力値の妥当性を確認し、必要に応じて前処理を行うことを心がけましょう。これにより、より安定したアプリケーションの開発が可能になります。