web-dev-qa-db-ja.com

dartで文字列が数値かどうかを確認する

Dartで文字列が数値かどうかを調べる必要があります。 Dartの任意の有効な数値タイプでtrueを返す必要があります。これまでのところ、私の解決策は

bool isNumeric(String str) {
  try{
    var value = double.parse(str);
  } on FormatException {
    return false;
  } finally {
    return true;
  }
}

これを行うネイティブの方法はありますか?そうでない場合、それを行うより良い方法はありますか?

25
scrblnrd3

これは少し簡略化できます

_void main(args) {
  print(isNumeric(null));
  print(isNumeric(''));
  print(isNumeric('x'));
  print(isNumeric('123x'));
  print(isNumeric('123'));
  print(isNumeric('+123'));
  print(isNumeric('123.456'));
  print(isNumeric('1,234.567'));
  print(isNumeric('1.234,567'));
  print(isNumeric('-123'));
  print(isNumeric('INFINITY'));
  print(isNumeric(double.INFINITY.toString())); // 'Infinity'
  print(isNumeric(double.NAN.toString()));
  print(isNumeric('0x123'));
}

bool isNumeric(String s) {
  if(s == null) {
    return false;
  }
  return double.parse(s, (e) => null) != null;
}
_
_false   // null  
false   // ''  
false   // 'x'  
false   // '123x'  
true    // '123'  
true    // '+123'
true    // '123.456'  
false   // '1,234.567'  
false   // '1.234,567' (would be a valid number in Austria/Germany/...)
true    // '-123'  
false   // 'INFINITY'  
true    // double.INFINITY.toString()
true    // double.NAN.toString()
false   // '0x123'
_

double.parse DartDocから

_   * Examples of accepted strings:
   *
   *     "3.14"
   *     "  3.14 \xA0"
   *     "0."
   *     ".0"
   *     "-1.e3"
   *     "1234E+7"
   *     "+.12e-9"
   *     "-NaN"
_

このバージョンは16進数も受け入れます

_bool isNumeric(String s) {
  if(s == null) {
    return false;
  }

  // TODO according to DartDoc num.parse() includes both (double.parse and int.parse)
  return double.parse(s, (e) => null) != null || 
      int.parse(s, onError: (e) => null) != null;
}

print(int.parse('0xab'));
_

本当

[〜#〜]更新[〜#〜]

{onError(String source)}は廃止されたため、tryParseを使用できます。

_bool isNumeric(String s) {
 if (s == null) {
   return false;
 }
 return double.tryParse(s) != null;
}
_
28

Dart 2では、このメソッドは廃止されました

int.parse(s, onError: (e) => null)

代わりに、

 bool _isNumeric(String str) {
    if(str == null) {
      return false;
    }
    return double.tryParse(str) != null;
  }
26
Matso Abgaryan

さらに短い。 doubleでも機能するという事実にもかかわらず、numを使用する方がより正確です。

isNumeric(string) => num.tryParse(string) != null;

num.tryParse内部:

static num tryParse(String input) {
  String source = input.trim();
  return int.tryParse(source) ?? double.tryParse(source);
}
8
Airon Tark