79 votes

JavaScript : Analyse d'une chaîne de caractères Valeur booléenne ?

JavaScript a parseInt() y parseFloat() mais il n'y a pas de parseBool o parseBoolean dans le champ d'application global, pour autant que je sache.

J'ai besoin d'une méthode qui prenne des chaînes avec des valeurs comme "true" ou "false" et qui renvoie un code JavaScript. Boolean .

Voici comment je procède :

function parseBool(value) {
    return (typeof value === "undefined") ? 
           false : 
           // trim using jQuery.trim()'s source 
           value.replace(/^\s+|\s+$/g, "").toLowerCase() === "true";
}

Est-ce une bonne fonction ? N'hésitez pas à me faire part de vos commentaires.

Gracias.

0 votes

Et vous pouvez également poster votre code sur codereview.stackexchange.com si vous ne cherchez que des revues de code...

0 votes

91voto

RGB Points 1609

Je serais enclin à faire un one liner avec un ternaire si.

var bool_value = value == "true" ? true : false

Editer : Il serait encore plus rapide d'éviter d'utiliser l'instruction logique a et de se contenter d'utiliser l'expression elle-même :

var bool_value = value == 'true';

Cela fonctionne parce que value == 'true' est évaluée en fonction du fait que le value est une chaîne de caractères 'true' . Si c'est le cas, toute l'expression devient true et si ce n'est pas le cas, il devient false ce résultat est alors affecté à bool_value après évaluation.

42 votes

Pourquoi ne pas le raccourcir encore un peu plus ? var bool_value = value == "true" fait la même chose :)

12 votes

Une expression ternaire pourrait être utile ici, pour gérer le cas où l'on vous passe null/undefined/empty : bool_value = value ? (value.toLowerCase() == "true") : false

1 votes

"true" ? true : false est ternaire, mais oui, il peut être étendu pour vérifier la présence de null/undefined/empty

16voto

Martin Jespersen Points 13702

Cela dépend de la manière dont vous souhaitez que la fonction fonctionne.

Si tout ce que vous souhaitez faire est de tester la présence du mot "true" à l'intérieur de la chaîne, et de définir toute chaîne (ou non) qui ne le contient pas comme étant fausse, la méthode la plus simple est probablement la suivante :

function parseBoolean(str) {
  return /true/i.test(str);
}

Si vous souhaitez vous assurer que la chaîne entière est le mot true, vous pouvez procéder de la manière suivante :

function parseBoolean(str) {
  return /^true$/i.test(str);
}

2 votes

La manière dont cela fonctionne nativement est absolument stupide. La fonction booléenne devrait faire la même chose que dans vos exemples. Si l'on veut savoir si une chaîne contient le mot true ou false, il faut vérifier si l'index est > 0.

0 votes

Cela entraîne une énorme surcharge de travail pour la correspondance avec les expressions rationnelles, au lieu de simplement vérifier si la chaîne contient "true" ou non.

0 votes

@Soviut : c'est vrai, la solution RGBs est préférable.

11voto

flem Points 12892

Vous pouvez essayer ce qui suit :

function parseBool(val)
{
    if ((typeof val === 'string' && (val.toLowerCase() === 'true' || val.toLowerCase() === 'yes')) || val === 1)
        return true;
    else if ((typeof val === 'string' && (val.toLowerCase() === 'false' || val.toLowerCase() === 'no')) || val === 0)
        return false;

    return null;
}

S'il s'agit d'une valeur valide, il renvoie la valeur bool équivalente, sinon il renvoie null.

0 votes

Cela a presque fonctionné, je l'ai un peu modifié pour qu'il fonctionne correctement (guillemets simples autour de 'string' ) : function parseBool(val) { if ((typeof val == 'string' && (val.toLowerCase() === 'true' || val.toLowerCase() === 'yes')) || val === 1) return true; else if ((typeof val === 'string' && (val.toLowerCase() === 'false' || val.toLowerCase() === 'no')) || val === 0) return false; return null; }

0 votes

@delliottg Mis à jour avec des citations sur chaîne de caractères .

3voto

RoToRa Points 20081

Personnellement, je pense qu'il n'est pas bon que votre fonction "cache" les valeurs non valides en tant que false et - en fonction de vos cas d'utilisation - ne renvoie pas true para "1" .

Un autre problème pourrait être qu'il dégueule sur tout ce qui n'est pas une chaîne de caractères.

J'utiliserais quelque chose comme ceci :

function parseBool(value) {
  if (typeof value === "string") {
     value = value.replace(/^\s+|\s+$/g, "").toLowerCase();
     if (value === "true" || value === "false")
       return value === "true";
  }
  return; // returns undefined
}

Et en fonction des cas d'utilisation, l'étendre pour faire la distinction entre "0" y "1" .

(Il existe peut-être un moyen de ne comparer qu'une fois par rapport à "true" mais je n'arrive pas à trouver quelque chose pour l'instant).

0 votes

Désolé de déterrer un très vieux code, mais pourquoi ne pas simplement return true; ? pourquoi return value === "true"; ? Je veux dire que vous avez déjà vérifié si elle était valide, n'est-ce pas ?

0 votes

@Metagrapher Si je return true il renverra vrai si la valeur est "false" également.

0 votes

Je ne sais pas ce qui m'a pris de lire ce code. Désolé, merci pour la clarté.

2voto

MiniGod Points 1140

Pourquoi ne pas rester simple ?

var parseBool = function(str) {
    if (typeof str === 'string' && str.toLowerCase() == 'true')
            return true;

    return (parseInt(str) > 0);
}

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