2012-06-03 1 views
0

J'ai créé un convertisseur de nombres en mots pour 0-999 et j'ai presque réussi à le faire fonctionner à part un bug.Espace manquant dans le convertisseur de mots javascript en chiffres

Dans certains nombres supérieurs à 100, il manque un espace entre la section «cent» et la section «dizaines/unités».

Par exemple 864 donne « eth canspajar ha tri ugens » où il doit y avoir un espace entre les boîtes et les pajar (cent = boîtes)

Il semble être un problème régulier, car il arrive à 164, 264, 364, etc., et des plages d'autres nombres.

Est-ce que quelqu'un avec une meilleure connaissance de Javascript ou de maths peut regarder mon code et voir s'ils peuvent apercevoir le modèle, ou une solution? Le code provient d'un convertisseur de nombres français que je n'ai pas fait et je suis relativement nouveau à Javascript, donc c'est compliqué pour moi de comprendre complètement tout ce qui est là.

Vous pouvez voir le code ci-dessous ou à http://jsfiddle.net/nickykw/tMXmj/2/

Un grand merci

function num2Letters(number) { 

     if (isNaN(number) || number < 0 || 999 < number) { 
      return 'Veuillez entrer un nombre entier compris entre 0 et 999.'; 
     } 

     var units2Letters = ['', 'onen', 'dew', 'tri', 'pajar', 'pemp', 'whegh', 'seyth', 'eth', 'naw', 'deg', 'udnek', 'dowdhek', 'tredhek', 'peswardhek', 'pemthek', 'whetek', 'seytek', 'etek', 'nownsek'], 
      tens2Letters = ['', 'deg', 'ugens', 'warn ugens', 'dew ugens', 'ha dew ugens', 'tri ugens', 'ha tri ugens', 'pajar ugens', 'ha pajar ugens']; 
      twenties2Letters = ['', 'deg', 'ugens', 'warn ugens', 'dew ugens', 'ha dew ugens', 'tri ugens', 'ha tri ugens', 'pajar ugens', 'ha pajar ugens', 'pemp ugens', 'ha pemp ugens', 'whegh ugens', 'ha whegh ugens', 'seyth ugens', 'ha seyth ugens', 'eth ugens', 'hag eth ugens', 'naw ugens', 'ha naw ugens']; 
      hundreds2Letters = ['', 'cans', 'dew cans', 'tri hans', 'pajar cans', 'pemp cans', 'whegh cans', 'seyth cans', 'eth cans', 'naw cans']; 

     var units = number % 10, 
      tens  = (number % 100 - units)/10, 
      twenties = (number % 200 - units)/10, 
      hundreds = (number % 1000 - number % 100)/100; 

     var unitsOut, tensOut, twentiesOut, hundredsOut; 


     if (number === 0) { 

      return 'mann'; 

     } else { 

      // THE UNITS 

     unitsOut = units2Letters[units]; 

      // THE TENS 

      if (tens === 1 && units > 0) { 

       tensOut = units2Letters[10 + units]; 
       unitsOut = ''; 

      } else if (tens === 2 && units !== 0) { 

       tensOut = units2Letters[units] + ' warn ' + tens2Letters[tens]; 
       unitsOut = ''; 

      } else if (tens === 3) { 

       tensOut = units2Letters[10 + units] + ' ' + tens2Letters[tens]; 
       unitsOut = ''; 


      } else if ((tens === 4 && units !== 0) || (tens === 6 && units !== 0) || (tens === 8 && units !== 0)) { 

       tensOut = units2Letters[units] + ' ha ' + tens2Letters[tens]; 
       unitsOut = ''; 

      } else if (tens === 5 || tens === 7 || tens === 9) { 

       tensOut = units2Letters[10 + units] + ' ' + tens2Letters[tens]; 
       unitsOut = ''; 

      } else { 

       tensOut = tens2Letters[tens]; 

      } 





      // THE TWENTIES - used only for 120-199 

      if ((number >= 121 && number <= 199) && (tens === 2 || tens === 4 || tens === 8) && units > 0) { 

       twentiesOut = units2Letters[units] + ' ha ' + twenties2Letters[twenties]; 

      } else if ((number >= 121 && number <= 199) && (tens === 3 || tens === 5 || tens === 7 || tens === 9)) { 

       twentiesOut = units2Letters[10 + units] + ' ' + twenties2Letters[twenties]; 

      } else if ((number >= 121 && number <= 199) && (tens === 6)) { 

       twentiesOut = units2Letters[units] + ' hag ' + twenties2Letters[twenties]; 

      } else { 

       twentiesOut = twenties2Letters[twenties]; 

      } 







      // THE HUNDREDS 

     //if the number is x01-09 or number is x1x or number is x2x or number is x3x then add a hag/ha after the number (hag if the number is xx1 or xx8 or x20) 
      if ((hundreds >= 1 && tens === 0 && units >= 1) || hundreds >= 1 && tens === 1 || hundreds >= 1 && tens === 2 || hundreds >= 1 && tens === 3) { 

       hundredsOut = hundreds2Letters[hundreds] + (hundreds >= 1 && (units === 1 || units === 8) || hundreds >= 1 && tens === 2 && units === 0 ? ' hag ' : ' ha '); 


      // insert a ha for 40, 60 and 80 above 200 
      } else if (hundreds >= 2 && (tens === 4 || tens === 6 || tens === 8) && units === 0) { 

       hundredsOut = hundreds2Letters[hundreds] + ' ha '; 

      } else { 

       hundredsOut = hundreds2Letters[hundreds]; 

      } 


      // GET TOTAL 

      if (number === 50) { 

       return hundredsOut + (hundredsOut && tensOut ? ' ': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? '' : '') + unitsOut + ' <i>or</i> hanter cans'; 

      } else if (number === 150) { 

       return hundredsOut + (hundredsOut && tensOut ? ' ': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? '' : '') + unitsOut + ' <i>or</i> deg ha seyth ugens <i>or</i> onen cans ha hanter'; 

      } else if (hundreds > 1 && tens === 5 && units === 0) { 

       return hundredsOut + (hundredsOut && tensOut ? ' ': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? '' : '') + unitsOut + ' <i>or</i> ' + hundredsOut + ' ha hanter'; 

      } else if (hundreds === 1 && (tens === 2 || tens === 3 || tens === 4 || tens === 5 || tens === 6 || tens === 7 || tens === 8 || tens === 9)) { 

       return twentiesOut + ' <i>or</i> ' + hundredsOut + (hundredsOut && tensOut ? '': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? '' : '') + unitsOut; 

      } else { 

      return hundredsOut + (hundredsOut && tensOut ? '': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? '' : '') + unitsOut; 

      } 

     } 

    } 



    var userEntry; 

    while (userEntry = prompt('Enter a number between 0 and 999:')) { 

     alert(num2Letters(parseInt(userEntry, 10))); 

    } 
+0

Le problème d'espace semble maintenant être résolu à http://jsfiddle.net/nickykw/tMXmj/14/ – Bob

+0

Comment puis-je modifier l'invite dans un formulaire HTML qui affiche la sortie dans un span? – Bob

Répondre

3

plutôt que d'essayer de trouver l'espace manquant, je suggère que vous restructurer le code afin que vous rédigez pas les chaînes sur la mouche, mais plutôt pour ajouter des composants de votre phrase à un tableau (en utilisant push ou concat au besoin), puis appelez join sur la matrice.

Par exemple

var result = ['eth','cans']; 
result.push('pajar'); 
result = result.concat(['ha','tri','ugens']); 
alert(result.join(' ')); 

L'avantage ici est que votre code est beaucoup plus propre et vous n'avez pas à vous soucier de couper les espaces avant et arrière qui pourraient finir ici et là pour certaines entrées.

+0

Merci. Malheureusement ce genre de codage est bien au-dessus de moi. – Bob

1

Ici, vous avez? '': '' ce qui n'a pas de sens, je suppose que l'un d'eux doit être '' (espace), sinon, vous n'avez même pas besoin de l'opérateur trinaire, juste mettre là ''

} else if (hundreds === 1 && (tens === 2 || tens === 3 || tens === 4 || tens === 5 || tens === 6 || tens === 7 || tens === 8 || tens === 9)) { 

     return twentiesOut + ' <i>or</i> ' + hundredsOut + (hundredsOut && tensOut ? '': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? '' : '') + unitsOut; 
1

Je crois que vous avez 2 questions ici:

  1. Dans « CENTAINES » section concaténez « HAG » et « ha » - vous devez supprimer les espaces de fin. En tant que dernier élément de la concaténation, vous ne pouvez pas prédire à ce moment si vous souhaitez ajouter un espace à la fin ou non.
  2. Dans la section "GET TOTAL" le retour doit être mis à jour comme suit:

return hundredsOut + (hundredsOut && tensOut ? ' ': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? ' ' : '') + unitsOut;

C'est l'endroit approprié pour insérer des espaces.

+0

Néanmoins, je suis d'accord avec @Ray Toal que les valeurs de centaines, dizaines et ones doivent être écrites dans un tableau et une chaîne concaténée au lieu de la méthode que vous utilisez actuellement. –

+0

Merci. Le problème d'espace semble être résolu maintenant, à l'adresse http: // jsfiddle.net/nickykw/tMXmj/14 / – Bob

Questions connexes