😎

Flutter: TextFormFieldの数値入力で起きるPostgreSQL整数型範囲エラーと対策

に公開

現在個人開発で、顧客管理アプリ兼商品管理アプリを作成しています。
リリース前に一通りデバッグをしていた所、下記のエラーが出たのでそれの原因と対策についてまとめていきます。

このエラーは、PostgreSQLデータベースの整数型の範囲を超える値を保存しようとした時に出るようです。
ググってみると、PostgreSQLのinteger型は2,147,483,647(約21億円)が上限のようです。

参考

https://salumarine.com/max-integer-value-is-2147483647-in-postgresql/

なので、

  • 1万円: 10,000 → 問題なく保存可能
  • 100万円: 1,000,000 → 問題なく保存可能
  • 10億円: 1,000,000,000 → 問題なく保存可能
  • 30億円: 3,000,000,000 → エラー発生! 整数型の範囲を超えている

という感じです。
そもそも作っているアプリで 21億を超えることは理論上あり得ません。
が、ユーザーが誤って大きな数値を入力してしまう可能性や、悪意あるユーザーが意図的に大きな数値を入力する可能性もあります。(どっちかと言うと後者のリスクが怖かった)

又、気づいてしまったからにはある程度の対策をしておきたいというものです。

対策は簡単で、inputFormattersの中にの中にFilteringTextInputFormatterというプロパティ(パラメータ)があるのでそれを使えば解決です。
下記のようにLengthLimitingTextInputFormatterに最大桁数を渡してあげれば、その桁数以上は入力が出来なくなります。

// 桁数を6桁(99万9999円)に制限しつつバリデーションを追加

TextFormField(
  keyboardType: TextInputType.number,
  inputFormatters: [
    FilteringTextInputFormatter.digitsOnly,
    LengthLimitingTextInputFormatter(6), // ここに最大桁数
  ],
  validator: (value) {
    if (value == null || value.isEmpty) {
      return '値を入力してください';
    }
    
    final number = int.tryParse(value);
    if (number == null) {
      return '有効な数値を入力してください';
    }
    
    if (number > 999999) {
      return '999999以下の値を入力してください';
    }
    
    return null;
  },
)

終わり。

Discussion