web-dev-qa-db-fra.com

Vérifier si la chaîne est numérique dans la fléchette

J'ai besoin de savoir si une chaîne est numérique dans Dart. Il doit retourner vrai sur tout type de numéro valide dans Dart. Jusqu'à présent, ma solution est

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

Existe-t-il une manière native de procéder? Sinon, existe-t-il une meilleure façon de procéder?

25
scrblnrd3

Cela peut être un peu simplifié

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'

de double.parse DartDoc

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

Cette version accepte également les nombres hexadécimaux

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'));

vrai

MISE À JOUR

Puisque {onError(String source)} est obsolète, vous pouvez simplement utiliser tryParse:

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

Dans Dart 2, cette méthode est déconseillée

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

utilisez plutôt

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

Encore plus court. Malgré le fait que cela fonctionne également avec double, l'utilisation de num est plus précise.

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

num.tryParse à l'intérieur:

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