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?
Dart objects have runtimeType property which returns Type . To check whether the object has a certain type, use == operator. Unlike is , it will only return true if compared to an exectly same type, which means comparing it with its super class will return false .
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; }
In Dart 2 this method is deprecated
int.parse(s, onError: (e) => null)
instead, use
bool _isNumeric(String str) { if(str == null) { return false; } return double.tryParse(str) != null; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With