10

How can i simply check if a returned value of type int or uint is a number?

mate64
  • 9,876
  • 17
  • 64
  • 96

4 Answers4

13

Simple:

if(_myValue is Number)
{
    fire();

}// end if

[UPDATE]

Keep in mind that if _myValue is of type int or uint, then (_myValue is Number) will also equate to true. If you want to know if _myValue is a number that isn't an integer(int) or unsigned integer (uint), in other words a float, then you can simply modify the conditional as follows:

(_myValue is Number && !(_myValue is int) && !(_myValue is uint))

Let's look at an example:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var number1:Object = 1; // int
            var number2:Object = 1.1; // float
            var number3:Object = 0x000000; // uint

            trace(number1 is Number); // true
            trace(number2 is Number); // true
            trace(number3 is Number); // true

            trace(number1 is Number && !(number1 is int) && !(number1 is uint)); // false
            trace(number2 is Number && !(number2 is int) && !(number2 is uint)); // true
            trace(number3 is Number && !(number3 is int) && !(number3 is uint)); // false

        }

    }

}
Taurayi
  • 3,209
  • 2
  • 17
  • 15
  • "_myValue is Number" will still be true and typeof(_myValue) will still be "number" even if _myValue is typed as int or uint. According to http://stackoverflow.com/a/9447869/88409 Flash stores integer values as ints, and as Number only if there is a fractional part in the value or it exceeds 0x0FFFFFFF (highest value that can be stored in the remaining 28-bits of the 32-bit atom that reserves 3 bits for a type description and 1 bit for the sign). See also http://stackoverflow.com/a/2697151/88409 and a test case here: http://troyworks.com/blog/2007/12/02/as3-understanding-uint-int-number/ – Triynko Aug 14 '12 at 17:26
  • Questioner wants to know if _myValue is a number, not a Number. – Robert Nov 15 '12 at 22:25
  • @Robert sorry I can be a bit of a dunce sometimes, not quite sure what you are getting at. – Taurayi Nov 16 '12 at 00:18
  • @Taurayi Your method returns false for valid numeric strings. The question is ambiguous but I assumed he was looking for a way to tell if something is a number, not just if it's of a numeric type. – Robert Nov 16 '12 at 06:10
  • To account for numeric strings as well as Number, int, and uint, the test is much simpler: `var isNumeric:Boolean = !isNaN(Number(value));`. That will handle any Number value, but will also try to convert strings to numbers. If it's a number or can be converted to a number, then it's a numeric value. No need to test against Number, int, and uint types with the `is` operator explicitly. – Triynko Mar 04 '14 at 21:18
5

If you only want to know if myValue is one of the numeric types (Number, int, uint), you can check if (_myValue is Number) as Taurayi suggested.

If you also want to know if _myValue is a numeric string (like "6320" or "5.987"), use this:

if (!isNaN(Number(_myValue)))
{
    fire();
}

It uses Number(_myValue) to cast _myValue to the Number class. If Number is unable to convert it into a useful number it will return NaN, so we use !isNaN() to make sure the returned value is not "not a number".

It will return true for any variable of type Number (as long as its value isn't NaN), int, uint, and strings that contain a valid representation of a number.

Robert
  • 6,660
  • 5
  • 39
  • 62
  • 1
    IMO, this is the best answer. It's exactly what I would have posted. Although it doesn't completely explain the relationship between Number, int, and uint (i.e. any int is a Number, but Numbers aren't necessarily ints or uints), this implementation is better than the conditional checks, in part because it also takes numeric strings into account. – Triynko Mar 04 '14 at 21:15
  • @Triynko I edited my answer to better explain about the numeric types. – Robert Mar 05 '14 at 03:44
4

These methods could be problematic if you wish to check the input of a text field, which is 'always' a string. If you have a string with "123" and check with "123" is Number, you will get a false. So Number("123") would give true, but then again so will Number("lalala") (event though the result is NaN which will tell you NaN is Number (true).

To work with string you could do:

var s:String = "1234";
String(Number(s)) == String(s);
--True

var s:String = "lalala";
String(Number(s)) == String(s);
--False
Dario
  • 41
  • 1
3

There are

  • isNaN (You will want to negate this)
  • typeof (Not sure how strongly type Number works)
  • and is (which was already mentioned, again I am not sure how strong, types hold)
Community
  • 1
  • 1
phwd
  • 19,975
  • 5
  • 50
  • 78