stringnumbersdartisnumeric

Checking if string is numeric in dart


I need to find out if a string is numeric in dart. It needs to return true on any valid number type in dart. So far, my solution is

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

Is there a native way to do this? If not, is there a better way to do it?


Solution

  • This can be simpliefied a bit

    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'
    

    from double.parse DartDoc

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

    This version accepts also hexadecimal numbers

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

    true

    UPDATE

    Since {onError(String source)} is deprecated now you can just use tryParse:

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