【问题标题】:BugHunt - Javascript Parsing error?BugHunt - Javascript 解析错误?
【发布时间】:2010-10-21 10:39:51
【问题描述】:

网民!

也许你们中的某个人会发现以下函数有什么问题: 它是一个用于文本框客户端 onblur 事件的 javascript 函数,用于验证输入的文本是否代表格式正确且有效的日期。

我尝试了几次,它成功了,但似乎!应该尝试所有日期!

它适用于所有有效组合,但它似乎无法解析始终解析为 0 的“08”和“09”。我在 IE 和 Firefox 中都尝试过,结果相同,FF 的 javascript 控制台在代码中没有发现任何语法错误。

有人想比我聪明吗?我在代码中留下了警报,以在关键点检查我的变量值,在我看来一切都很好,直到解析,如果我有 08 或 09,在日或月部分......

使用的函数如下。

function DateVal(controle, culture, bToday)
{
    //var strDate = controle.value;
    var separateur = '';
    var dayPart = '';
    var monthPart = '';
    var yearPart = '';
    var tblParts;
    var isBisexuel = false;
    var valid = true;

    //alert('DateVal : Controle: ' + controle + 'Controle.value.length: ' + controle.value.length +  ' value: ' + controle.value  + ' culture: ' + culture);
    if (controle.value.length == 10)

    {
        if (culture == 'en-US') 
        {// Il s'agit d'un format de date avec séparateur "/", MM/dd/yyyy
            separateur = '/';
            dayPart = 1;
            monthPart = 0;
            yearPart = 2;
        }
        else if (culture == 'en-GB')
        {// Il s'agit d'un format de date avec séparateur "/", dd/MM/yyyy
            separateur = '/';
            dayPart = 0;
            monthPart = 1;
            yearPart = 2;
        }
        else if (culture == 'fr-CA')
        {// Il s'agit d'un format de date avec séparateur "-", yyyy-MM-dd
            separateur = '-';
            dayPart = 2;
            monthPart = 1;
            yearPart = 0;
        }
        else
        {
            valid = false;
            alert('Le contrôle est mal initialisé (pas de culture ou culture invalide); il n\'y a rien qui va marcher...');
            //window.event.returnValue =false;
        }
    }
    else
    {
        alert('longueur pas valide');

        valid = false;
    }
    if (valid == true)
    {
        alert('valeur: ' + controle.value + ' separateur: ' + separateur);
        tblParts = controle.value.split(separateur);
        alert('yavant parse: dayPart: ' + tblParts[dayPart] + 'monthPart: ' + tblParts[monthPart] +  ' yearPart: ' + tblParts[yearPart]);
        if (tblParts.length == 3)
        {
            dayPart = parseInt(tblParts[dayPart]);
            monthPart = parseInt(tblParts[monthPart]);
            yearPart = parseInt(tblParts[yearPart]);

            alert('après parse: pos0: ' + dayPart + 'pos1: ' + monthPart +  ' pos2: ' + yearPart);

            if (isNaN(dayPart) || isNaN(monthPart) || isNaN(yearPart))
            {
                //alert(dayPart + ' ' + monthPart + ' ' + yearPart);
                valid = false;
            }
            else
            {
                isBisexuel = ((yearPart % 400 == 0) || (yearPart % 4 == 0 && yearPart % 100 != 0));
                alert(isBisexuel);
                if (isBisexuel)
                {
                    tblDays = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
                }
                else
                {
                    tblDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
                }

                if (monthPart <= 12 && monthPart > 0)
                {
                    if (dayPart > tblDays[monthPart] || dayPart < 1)
                    {
                        alert('le jour fitte pas');
                        valid = false;
                    }
                }
                else
                {
                    alert('mois égal à 0 ou moins, ou supérieur à 12');
                    valid = false;
                }
            }
        }
        else
        {
            alert('le split donne pas 3 morceaux?');
            valid = false;
        }
    }
    //window.event.returnValue = valid;
    if(valid)
    {
        return;
    }
    else
    {
        if (bToday == true)
        {
            var dt = new Date();
            dayPart = dt.getDate();
            if (dayPart.toString().length == 1)
                dayPart = '0'+dayPart;
            monthPart = dt.getMonth();
            if (monthPart.toString().length == 1)
                monthPart = '0'+monthPart;
            yearPart = dt.getFullYear();
            //alert(dayPart + ' ' + monthPart + ' ' + yearPart + ' ' + culture);
            switch (culture)
            {
                case 'fr-CA':
                    controle.value = yearPart + separateur + monthPart + separateur + dayPart;
                    break;
                case 'en-US':
                    controle.value = monthPart + separateur + dayPart + separateur + yearPart;
                    break;
                case 'en-GB':
                    controle.value = dayPart + separateur + monthPart + separateur + yearPart;
                    break;
            }
            //alert(controle.value);
        }
        else
        {
            controle.value = '';
        }
    }
}

感谢大家的努力! 帕斯卡

【问题讨论】:

    标签: javascript parsing integer


    【解决方案1】:

    您需要将radix parameter 提供为 10,否则以 0 开头的值将被解析为八进制。例如:

    dayPart = parseInt(tblParts[dayPart], 10);
    

    【讨论】:

    • 非常感谢!我想知道我什么时候会想到这个!
    • radic 参数是 Douglas Crockford 的“JavaScript: The Good Parts”解决的问题之一。此外,在您的代码上使用 jslint.org —— 它会因为缺少基数参数而发牢骚。
    猜你喜欢
    • 2016-01-31
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多