7
votes

Convertir une chaîne entière en un entier en JavaScript

J'ai récemment couru dans un morceau de code comme celui-ci:

function ConvertToInteger(text)
{
    var number = Math.floor(+text);
    return text && number == text ? number : NaN;
}


6 commentaires

Peut-être dupliqué http: // Stackoverflow. com / questions / 131406 / What-is-the-best-m Ethod-to-convert-to-an-integer-in-javasc est


numéro (txthours) au lieu de numéro (txthours)


En outre, il existe une convention que les noms de fonction constructeur sont capitalisés et les noms de fonction réguliers non. Je recommande de coller à cette convention en utilisant un nom minuscule comme ConvertToyeger ou TOINTEGER . Autre que cela, la fonction me semble assez solide.


ConvertTOeTeger (true) retourne 1 qui n'est pas un comportement souhaité, je suppose.


Semble avoir une validation d'entrée lorsque ces valeurs entrent dans le système peuvent être une approche intéressante.


math.floor (+ x) gère les cas d'angle identiques que (x 0) , mais autour de zéro sémantique semble plus intuitif (à quelqu'un familier avec le float C / Java -> int Casts) que rond vers le sol.


4 Réponses :


4
votes

ici, c'est ce que je suis venu avec: xxx pré>

(Remarque: j'ai mis à jour cette fonction pour enregistrer sur les chaînes d'espace blanche. Voir ci-dessous.) p>

L'idée est de n'accepter que des arguments que tapez est un nombre ou une chaîne (mais pas la valeur de chaîne vide). Ensuite, une conversion en nombre est effectuée (au cas où il s'agissait d'une chaîne), et finalement sa valeur est comparée à la valeur de plancher () pour déterminer si le nombre est un entier ou non. P>

function integer(x) {
    if( /^\s*(\+|-)?\d+\s*$/.test(String(x)) ){
        return parseInt(x, 10);
    }
    return Number.NaN;
}  


8 commentaires

@CMS Oh, quel désordre :) Un chèque Regexp pourrait résoudre ce problème.


Je suis conscient que l'utilisation de Nan est une mauvaise utilisation, mais elle semblait aussi bonne chose que tout pour représenter un non-integile. Après tout, il n'y a pas de NAI. Il y a plusieurs choses que j'aurais pu faire, notamment à l'aide d'un objet NULL, non défini, d'un objet ou de plusieurs fonctions, mais NAN était ce que le code d'origine recherchait et il semblait assez clair pour aller de l'avant avec elle.


Ma première pensée quand j'ai vu cela, c'était d'utiliser une expression régulière, mais cela semblait trop sucré pour quelque chose que je pensais être très simple. Si nous voulions que nous puissions l'éviter ici en coupant l'entrée s'il s'agit d'une chaîne.


@ DRS9222 Yea, la valeur NAN est suffisamment bonne pour ce scénario. Surtout qu'il existe une fonction isnan (), vous pouvez donc tester facilement la valeur de retour pour déterminer si l'entrée est un entier valide ou non. x = entier (entrée); Si (! isnan (x)) {/ * Processez l'utilisateur de l'entrée * /} else {/ * Alert utilisateur que l'entrée est invalide * /}


@ DRS9222 Oui, couper la chaîne est une bonne idée. La méthode de garniture () ferait le travail, mais elle n'est pas implémentée dans IE8 et ci-dessous, de sorte qu'une méthode de garniture personnalisée () doit ensuite être définie pour ces navigateurs (qui est une tâche facile, BTW). Cependant, les expressions régulières sont très strictes qui rendent le tout plus robuste.


Je viens de me souvenir de quelque chose: typeof nouveau numéro (8) === "objet" et typeof nouvelle chaîne ("123") === "objet" , pour une raison quelconque . Donc, ces chèques de type peuvent créer des problèmes.


D'autre part, fageGerumber = {TOSTRING: fonction () {retour "7";}} sera volontiers satisfaite à cette dernière version de entier . Mais je ne pense pas que ce soit un problème. :)


@Zecc String (x) et numéro (x) convertir au type primitif. Nouvelle chaîne (x) et nouveau numéro (x) Objets de retour. C'est comme ça que c'est défini dans la spécification.



-1
votes

Vous pouvez d'abord convertir une chaîne en entier, puis retour à une chaîne à nouveau. Ensuite, vérifiez si les premier et second chaînes correspondent.

EDIT : un exemple de ce que je voulais dire: xxx

Cette fonction retournera vrai si une La chaîne que vous avez mise dans est vraiment un entier. Il peut être modifié si vous ne voulez pas de couper. L'utilisation de zéros de premier plan échouera, mais, encore une fois, vous pouvez vous en débarrasser de cette fonction si vous le souhaitez. De cette façon, vous n'avez pas besoin de gâcher avec nan ou regex, vous pouvez facilement vérifier la validité de votre entier strictif.


6 commentaires

@darioo Convertissez une chaîne en entier ... Comment? Il y a diverses méthodes.


@ Šime Vidas: J'ai mis à jour ma réponse. Je dirais que Parsint est toujours la meilleure façon de convertir une chaîne à un entier.


Je soupçonne que vous l'avez fait par conception, mais votre exemple échouera si quelque chose d'autre qu'une chaîne, y compris un entier, est utilisé comme entrée. Il ne renvoie pas non plus l'entier réel pour une utilisation.


@ DRS9222: Eh bien, vous avez demandé quelque chose qui convertira une chaîne, et non rien d'autre. Vous n'avez pas à utiliser cette fonction exactement comme écrit, vous pouvez la modifier vous-même pour répondre à vos besoins. Mais vous pouvez l'utiliser pour vérifier si une chaîne entrée est vraiment un entier, puis le convertit à l'aide d'une parseint pour une utilisation réelle. Ce que j'ai écrit est plus d'une fonction utilitaire.


Je comprends que et je viens de relire ma question initiale et que vous avez raison, j'ai dit une chaîne. Cependant, j'ai aussi spécifiquement mentionné NULL. Je suppose que j'ai été jeté par les tests que j'avais couru contre mon exemple et les autres réponses qui accepteraient quoi que ce soit d'entrée.


@ DRS9222: Eh bien, il serait trivial d'ajouter "" et null comme cas spécial dans cette fonction. La chose est, vous voulez un comportement spécial comme "" et null être converti en 0. De ma compréhension de JavaScript, il n'y a pas de fonctions générales qui feront exactement ce que Vous voulez, vous devez donc vous déplacer quelque chose par vous-même. Si vous voulez des réponses sans ambiguïtés, vous devez spécifier votre question un peu plus précisément.



1
votes

Voici ma tentative.

function integer(x) {
    var n = parseFloat(x); // No need to check typeof x; parseFloat does it for us
    if(!isNaN(n) && /^\s*(\+|-)?\d+\s*$/.test(String(x))){
        return n;
    }
    return Number.NaN;
}


1 commentaires

En réalité, en utilisant Number.Nan au lieu de NAN est un choix judicieux, car la variable globale nan peut être écrasée avec toute autre valeur (Var Nan = "FOO") et la propriété Number.Nan ne peut pas.



1
votes

Ma solution implique une astuce bon marché. Il est basé sur le fait que les opérateurs de bits de JavaScript convertissent leurs opérandes en entiers.

Je n'étais pas tout à fait sûr que les cordes représentant des entiers devraient travailler alors voici deux solutions différentes. P>

function integer (number) { 
  return ~~number == number ? ~~number : NaN; 
}

function integer (number) {
  return ~~number === number ? ~~number : NaN;
}


0 commentaires