0
votes

Mon code doit être détectant si une chaîne comporte des symboles de devise, mais il ne détectera pas £

Mon code est censé détecter les symboles monétaires et exécuter du code en fonction du résultat, mais le code ne détectera pas le «£» en aucune circonstance. Voici le code correspondant:

let requirements = [ "£", "$" ];
let mcontent = "$£50";
let y = 0;
for (let p = 0; p < requirements.length; ++p) {
    if (mcontent.includes(requirements[p])) {
        ++y;
    }
}
if (y == 1) {
    //this is considered success, only ONE currency symbol was detected. If mcontent = '$50' or '£50', we should be here.
} else {
    //this is considered failure, TWO or ZERO currency symbols were detected. In this scenario, I want the code to fail.
}


19 commentaires

Qu'est-ce que vous attendiez? Vous avez deux symboles de devise dans cette chaîne.


@ hev1 J'ai même répondu à la question en réécrivant le code sans remarquer 🤦


La question est que cela ne détecte pas le tout, même si c'est «50 £», qui devrait compter en tant que succès.


@Senseimunchkin je ne peux pas reproduire le problème: jsfiddle.net/qkl3zcyp


Il devrait être détecter 2 symboles, mais il ne détectera pas la £. Y devrait être égal à 2, pas 1.


CONSOLE.LOG (Y) Avant votre relevé IF, vous verrez 2 , pas 1.


Désolé, mais je ne comprends pas 2.


Op, vous ne retournez rien, ou ne faites rien à l'intérieur du si / else blocs. Est-ce le problème ici?


Livre et USD en même temps donnera 2 la sortie


Veuillez ajouter une description de ce que vous attendez


Plus facile d'utiliser une regex


@Senseimunchkin Quel navigateur utilisez-vous (et version?)


Christian, je n'inclus pas ce que j'ai dans les blocs if / sinon, car ils ne sont pas pertinents pour ma question. Mohsenalyafei, ce ne sera pas. C'est la question que je vais avoir Yash, je m'attends à ce que Y soit égal à 2 quand il y a à la fois $ et £, y à égaler 1 quand il n'y a qu'un seul symbole, et pour y à égal à 0 quand il n'y a pas non plus.


@NickParsons C'est une application nœud.js pour un bot de discorde.


@Senseimunchkin comme plusieurs personnes ont dit, y est égal à 2 au bas de ce bloc de capture. Vous n'avez pas connecté y avec console.log (y) ou que vous le verriez 2. Il s'agira beaucoup de problèmes de construction d'un bot de discorde sans savoir comment enregistrer une valeur .


Voir: JSFIDDLE.net/Z648JRS0


@Senseimunchkin Votre problème n'est pas reproductible (sur un serveur Nodejs Impress 2): repl.it/repls /WearAnCualiskstatetstatetstatetsex#index.js , vous manquez des détails, essayez de créer un exemple de reproductible minimal Pour que les gens puissent aider à déboguer votre code. Vous dites aussi que mcontent est saisi par l'utilisateur, assurez-vous que le personnage que vous pensez est £ qui est entré par l'utilisateur est en fait la même chose que celle dans votre tableau.


Le £ est le même signe utilisé dans la matrice.


J'ai couru les tonnes de code des moments et oui, j'ai enregistré y. Il génère 1 chaque fois.


3 Réponses :


0
votes

Si vous ne voulez pas utiliser RegEx, vérifiez simplement si la chaîne comprend un symbole, incrémentez un compteur et returniez s'il y avait exactement 1 correspondance:

P>

let testA = "$£50",
    testB = "£50",
    testC = "$50";

function checkString(str) {
  const symbols = ["£", "$"];
  let matches = 0;

  for (const symbol of symbols)
    if (str.includes(symbol)) matches++;
      
  return matches == 1;
}

console.log(
  checkString(testA),
  checkString(testB),
  checkString(testC)
);


3 commentaires

La variable McONTENT est entrée par l'utilisateur, pour l'exemple de l'exemple que je le mets en moi. Cela ne fonctionnerait pas dans mon scénario et j'ai besoin de la fonction.


@Senseimunchkin hein? S'il est entré par l'utilisateur, vous pouvez simplement le transmettre à checkstring . C'est comme ça que je l'ai appelé avec plusieurs entrées différentes en bas.


Aussi @senseimunchkin, cette réponse implémente string.includes , donc je suis confus par ce commentaire également.



-1
votes

Utilisez REGEXP Il retournera vrai ou flasé en fonction de la valeur. Cet exemple vous donnera une idée de la façon de l'utiliser

<p>Enter value</p>
<input id="elementTwo" type="text" />


2 commentaires

Le point est qu'ils veulent qu'il ne renvoie faux que s'il y a exactement un symbole de devise


@Leafthelegend merci de clarifier, j'ai probablement mal compris



2
votes

La manière la plus concise de le faire est de vérifier avec regexp code> comme ceci: xxx pré>

voici un exemple en direct: p>

P>

const mcontent1 = '$£50';
const mcontent2 = '£50';
const mcontent3 = '$50';

const regex = /£|\$/g; // slash to escape $ because it has special meaning in regex

console.log(mcontent1.match(regex).length == 1); // false
console.log(mcontent2.match(regex).length == 1); // true
console.log(mcontent3.match(regex).length == 1); // true


10 commentaires

Serait-il un moyen de modifier de manière dynamique la regex sur la base du tableau des exigences?


@Leafthelegend a demandé exactement la même question que j'avais. Les exigences sont écrites dans un fichier JSON et vous aurez besoin du regex pour travailler avec tout ce que je sais.


Oui. Const Regex = New Regexp (exigences.join ('|'). Remplacez ($ '', '\\ $' '),' g ') . Étant donné que $ a une signification particulière dans regexp , il doit être échappé avec une barre oblique. Et puisqu'un Slash a une signification spéciale dans les chaînes, la barre oblique elle-même doit être échappée d'une barre oblique.


Vous pouvez également simplement mettre les symboles monétaires dans une classe de caractères comme nouvelle regexp ("[" + ['$', '£']. Joindre ('') + "]") . Si vous n'êtes pas limité à un ensemble de symboles monétaires et que vous vouliez vous permettre d'autoriser l'un d'entre eux, vous pouvez simplement utiliser / \ p {s} /


C'est intéressant, je ne le savais pas. Cela devrait être la bonne réponse. Utilisez / \ p {s} / g comme valeur de regex si vous autorisez tout symbole de devise.


Attendez, savoir '3,50 $'.Match (/ \ p {s} / g) évalue vers null ?


Hm ... il semble que JavaScript ne puisse pas prendre en charge les gammes Unicode. Ça craint. JavaScript est toujours un peu derrière dans le département de regex. Quoi qu'il en soit, si vous voulez vérifier les gammes, c'est une bonne ressource: régulier-expressions.info /unicode.html


Mais ici, c'est en action, juste pour prouver que je ne ment pas ;-) Regex101.com/r / SSRBG9 / 1


Ah! Je dois ajouter le drapeau u . Donc, la regex correcte est / \ p {s} / gu . Je l'avais également vu travailler sur ce site Web, c'est pourquoi j'ai été confus.


Ils ne s'appuient pas sur le moteur de regex du navigateur pour le faire. Ils vous laissent également faire des points de vue, que JavaScript ne supporte pas unanimement (et même à quoi ressemblons peu nous sommes assez récents). Si vous remarquez, ils vous ont même laissé choisir différents moteurs de regex.