1

这两个 Javascript 函数应该将序列号 (2-9999) 例如转换为数字,但以下函数由于某种原因无法正常工作..它们最初是用 PHP 编写的......在 PHP 中工作但不适用于 Javascript。

<html>
<head>
<script type="text/javascript">

    function my_isnum(str, negative=false, decimal=false)
{
    var has_decimal = false;
    var len = strlen(str);
    if (len > 0) {
        var valid = true;
        for (var i=0; valid && i < len; i++) {
            if (!(str[i] >= "0" && str[i] <= "9")) {
                if (str[i] == "-") {
                    if (!negative || i != 0) {
                        valid = false;
                    }
                } else if (str[i] == ".") {
                    if (!decimal || has_decimal) {
                        valid = false;
                    }
                } else {
                    valid = false;
                }
            }
        }
    } else {
        valid = false;
    }
    return valid;
}

function esn_to_num(esn) {
    var tmp = [];
    if ((tmp = esn.split("-")) {
        if (tmp.length == 2
            && my_isnum(tmp[0])
            && my_isnum(tmp[1])
        ) {
            esn = ((tmp[0] << 23) | tmp[1]);
        } else {
            esn = -1;
        }
    } else {
        esn = -1;
    }
    return esn;
}

alert(2-9999);

</script> </head>
</html>

原始 PHP 函数

<?php
function my_isnum($str, $negative=false, $decimal=false)
{
    $has_decimal = false;
    $len = strlen($str);
    if ($len > 0) {
        $valid = true;
        for ($i=0; $valid && $i<$len; $i++) {
            if (!($str[$i] >= '0' && $str[$i] <= '9')) {
                if ($str[$i] == '-') {
                    if (!$negative || $i != 0) {
                        $valid = false;
                    }
                } else if ($str[$i] == '.') {
                    if (!$decimal || $has_decimal) {
                        $valid = false;
                    }
                } else {
                    $valid = false;
                }
            }
        }
    } else {
        $valid = false;
    }
    return $valid;
}

function esn_to_num($esn)
{

    if (($tmp = explode('-', $esn))) {

        if (sizeof($tmp) == 2
            && my_isnum($tmp[0])
            && my_isnum($tmp[1])
        ) {
            $esn = (($tmp[0] << 23) | $tmp[1]);
        } else {
            $esn = -1;
        }
    } else {
        $esn = -1;
    }

    return $esn;
}




?>
4

2 回答 2

4

Javascript中没有这样的东西strlen。改为使用str.length

此外,正如 Jason Sperske 在下面建议的那样,更改此:

function my_isnum(str, negative=false, decimal=false)

对此:

function my_isnum(str, negative, decimal)
{
    if (typeof negative == "undefined") negative = false;
    if (typeof decimal == "undefined") decimal = false;
    ....
}
于 2013-02-01T23:37:32.033 回答
3

这两个 javascript 函数应该将序列号 (2-9999) 例如转换为数字。

为什么不直接去掉-并解析为十进制数呢?

function padToFourDigits(_, digits) {
  return "0000".substring(digits.length) + digits;
}

function serialToNum(serialNumStr) {
  return +(serialNumStr.replace(/-(\d{1,4})/g, padToFourDigits));
}

然后

serialToNum('2-9999') === 29999

serialToNum('2-999')  === 20999
于 2013-02-01T23:41:35.800 回答