title: Best implementation for an isNumber(string) method
body: <p>In my limited experience, I've been on several projects that have had some sort of string utility class with methods to determine if a given string is a number.  The idea has always been the same, however, the implementation has been different.  Some surround a parse attempt with try/catch </p>
  
  <pre><code>public boolean isInteger(String str) {
      try {
          Integer.parseInt(str);
          return true;
      } catch (NumberFormatException nfe) {}
      return false;
  }
  </code></pre>
  
  <p>and others match with regex</p>
  
  <pre><code>public boolean isInteger(String str) {
      return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
  }
  </code></pre>
  
  <p>Is one of these methods better than the other?  I personally prefer using the regex approach, as it's concise, but will it perform on par if called while iterating over, say, a list of a several hundred thousand strings?</p>
  
  <p>Note: As I'm kinda new to the site I don't fully understand this Community Wiki business, so if this belongs there let me know, and I'll gladly move it.</p>
  
  <p><strong>EDIT:</strong>
  With all the TryParse suggestions I ported Asaph's benchmark code (thanks for a great post!) to C# and added a TryParse method.  And as it seems, the TryParse wins hands down.  However, the try catch approach took a crazy amount of time.  To the point of me thinking I did something wrong! I also updated regex to handle negatives and decimal points. </p>
  
  <p>Results for updated, C# benchmark code:</p>
  
  <pre><code>00:00:51.7390000 for isIntegerParseInt
  00:00:03.9110000 for isIntegerRegex
  00:00:00.3500000 for isIntegerTryParse
  </code></pre>
  
  <p>Using:</p>
  
  <pre><code>static bool isIntegerParseInt(string str) {
      try {
          int.Parse(str);
          return true;
      } catch (FormatException e){}
      return false;
  }
  
  static bool isIntegerRegex(string str) {
      return Regex.Match(str, "^-?[0-9]+(\\.[0-9]+)?$").Success;
  }
  
  static bool isIntegerTryParse(string str) {
      int bob;
      return Int32.TryParse(str, out bob);
  }
  </code></pre>