70 votes

Convertir une chaîne de caractères en nombre en javascript/jQuery

J'ai essayé de convertir les données suivantes en chiffres :

<button class="btn btn-large btn-info" data-votevalue="1">
    <strong>1</strong>
</button>

var votevalue = parseInt($(this).data('votevalue'));

J'ai également essayé Number() mais je reçois toujours NaN lors de la vérification du résultat. Qu'est-ce qui ne va pas ?

Voici le code complet :

<div class="span7" id="button-group">
    <div class="btn-group">
        <button class="btn btn-large btn-info" data-votevalue="1"><strong>1</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="2"><strong>2</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="3"><strong>3</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="4"><strong>4</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="5"><strong>5</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="6"><strong>6</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="7"><strong>7</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="8"><strong>8</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="9"><strong>9</strong></button>
        <button class="btn btn-large btn-info" data-votevalue="10"><strong>10</strong></button>
    </div>
</div>

$('#button-group button').each(function() {
    $(this).click(function() {
        $(this).addClass('active');
        var votevalue = parseInt($(this).data('votevalue'));
        var filename = $('.mainimage').data('filename');
        var votes = parseInt($('.mainimage').data('numvotes'));
        var totalscore = parseInt($('.mainimage').data('totalscore'));
        $.ajax({
            type: 'POST',
            url: 'index.php/?category=vote',
            data: {
                "votevalue": votevalue,
                "filename": filename
            },
            success: function() {
                votes++;
                alert(votes);
                var average = ((totalscore + votevalue) / votes);
                $('#vote-incremenet').html(votes);
                $('#display-average').html(average);
                $('#display-average').show();
                $('#button-group button').each(function(){
                    $(this).unbind('click');
                });
            }
        }); // end ajax
    }); // end click
}); // end each

0 votes

Qu'est-ce que this dans ce contexte ?

2 votes

Ce que vous avez fonctionne très bien, je ne peux donc que supposer que this ne correspond pas à ce que vous attendez. N'oubliez pas non plus l'argument radix de la commande parseInt !

1 votes

Voulez-vous la valeur de la propriété data-votevalue ou le texte à l'intérieur des balises <strong></strong> ?

94voto

Rory McCrossan Points 69838

On dirait que this dans votre code ne fait pas référence à votre .btn élément. Essayez de le référencer explicitement avec un sélecteur :

var votevalue = parseInt($(".btn").data('votevalue'), 10);

N'oubliez pas non plus le radix.

0 votes

J'obtiens la chaîne correcte lorsque je n'essaie pas d'analyser la variable. Il s'agit donc d'une référence au bon objet. J'ai posté le code complet dans mon message original. Peut-être pourriez-vous y jeter un coup d'œil.

0 votes

Le problème doit donc se situer ailleurs dans votre code, car la fonction parseInt(votevalue) fonctionne bien : jsfiddle.net/fVJRL

52voto

Anton Points 19070

Vous pouvez utiliser parseInt(string, radix) pour convertir une chaîne de caractères en un nombre entier, comme dans le code ci-dessous

var votevalue = parseInt($('button').data('votevalue'));
​

DEMO

0 votes

Ne peut pas faire confiance à parseInt() a essayé "1,633" il retourne "1".

32voto

Shahar Points 575

Bien qu'il s'agisse d'un vieil article, j'ai pensé qu'une simple fonction pouvait rendre le code plus lisible et respecter le style de code de chaînage de jQuery :

String.prototype.toNum = function(){
    return parseInt(this, 10);
}

peut être utilisé avec jQuery :

var padding_top = $('#some_div').css('padding-top'); //string: "10px"
var padding_top = $('#some_div').css('padding-top').toNum(); //number: 10`

ou avec n'importe quel String objet :

"123".toNum(); //123 (number)`

12voto

cuixiping Points 644

Dans votre cas, il suffit d'utiliser :

var votevalue = +$(this).data('votevalue');

Il existe plusieurs façons de convertir une chaîne de caractères en nombre en javascript.

La meilleure façon :

var str = "1";
var num = +str; //simple enough and work with both int and float

Vous pouvez également :

var str = "1";
var num = Number(str); //without new. work with both int and float

o

var str = "1";
var num = parseInt(str,10); //for integer number
var num = parseFloat(str); //for float number

NE LE FAITES PAS :

var str = "1";
var num = new Number(str);  //num will be an object. typeof num == 'object'

N'utilisez parseInt que dans des cas particuliers, par exemple

var str = "ff";
var num = parseInt(str,16); //255

var str = "0xff";
var num = parseInt(str); //255

8voto

expoz Points 89

Vous devez simplement utiliser "+" avant $(this) . Cela va convertir la chaîne en nombre, donc :

var votevalue = +$(this).data('votevalue');

Oh et je recommande d'utiliser closest() au cas où :)

var votevalue = +$(this).closest('.btn-group').data('votevalue');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X