检查数值是否为数字

10

我该如何简单地检查返回类型为intuint的值是否为数字?

4个回答

13

简单:

if(_myValue is Number)
{
    fire();

}// end if

[更新]

请记住,如果 _myValueint 或者 uint 类型,那么 (_myValue is Number) 也将等于 true。如果你想要知道 _myValue 是否是一个不是整数(int)或无符号整数(uint)的数字,换句话说是一个浮点数,那么你可以简单地修改条件如下:

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

让我们看一个例子:

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

        }

    }

}

即使_myValue被定义为int或uint类型,"_myValue is Number"仍然成立,typeof(_myValue)仍然是"number"。根据https://dev59.com/A2ox5IYBdhLWcg3wFAc1#9447869,Flash将整数值存储为int类型,仅当值中存在小数部分或超过0x0FFFFFFF(可以存储在剩余28位的32位原子中,该原子保留3位用于类型描述和1位用于符号)时才存储为Number类型。另请参见http://stackoverflow.com/a/2697151/88409以及此处的测试用例:http://troyworks.com/blog/2007/12/02/as3-understanding-uint-int-number/。 - Triynko
提问者想知道_myValue是否是一个数字,而不是一个Number。 - Robert
@Robert,抱歉有时候我可能有点傻,不太确定你的意思。 - Taurayi
@Taurayi,你的方法对于有效的数字字符串返回false。这个问题有歧义,但我假设他是在寻找一种判断某个东西是否为数字的方法,而不仅仅是判断它是否为数字类型。 - Robert
为了考虑到数字字符串以及Number、int和uint,这个测试要简单得多:var isNumeric:Boolean = !isNaN(Number(value));。它将处理任何数字值,但也会尝试将字符串转换为数字。如果它是一个数字或者可以转换为数字,那么它就是一个数值。没有必要用"is"运算符显式地测试Number、int和uint类型。 - Triynko

5
如果您只想知道我的值是否为数字类型(Number,int,uint),您可以像Taurayi建议的那样检查(_myValue is Number)
如果您还想知道_myValue是否是一个数字字符串(如“6320”或“5.987”),请使用以下内容:
if (!isNaN(Number(_myValue)))
{
    fire();
}

它使用Number(_myValue)_myValue转换为Number类。如果Number无法将其转换为有用的数字,则会返回NaN,因此我们使用!isNaN()确保返回值不是“非数字”。

对于任何类型为Number(只要它的值不是NaN),intuint和包含有效数字表示的字符串,它都将返回true。


1
在我看来,这是最好的答案。它正是我想发表的。虽然它并没有完全解释Number、int和uint之间的关系(即任何int都是Number,但Numbers不一定是ints或uints),但这个实现比条件检查更好,部分原因是它还考虑了数字字符串。 - Triynko
@Triynko,我编辑了我的答案,以更好地解释数字类型。 - Robert

4

如果您希望检查始终为字符串的文本字段的输入,则这些方法可能会有问题。如果您有一个包含“123”的字符串并使用“123”进行数字检查,则会得到一个错误结果。因此,Number(“123”)将返回true,但是Number(“lalala”)也将返回true(即使结果为NaN,它仍将告诉您NaN是Number(true)。

要处理字符串,您可以执行以下操作:

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

var s:String = "lalala";
String(Number(s)) == String(s);
--False

3

有以下几种方式:

  • isNaN(您需要否定此选项)
  • typeof(不确定强类型 Number 的工作方式)
  • 以及 is(已经提到过,但我不确定类型的强度)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接