Javascript : Suite de nombre dans une variable non reconnue

Résolu
WakawaRider Messages postés 16 Statut Membre -  
WakawaRider Messages postés 16 Statut Membre -
Bonjour,
J'ai très peu de connaissance en informatique.
Je tente pour la première fois de créer une fonction pour calculer la moyenne des précipitations sur les 20 dernières années et l'année en cours pour un mois de l'année.
Les données sont obtenues avec une station météo amateur et le logiciel WsWIn32 par des tags de type %pluie_du_mois_X% envoyant une valeur numérique que je transforme en variable dans un fichier Javascript.
La variable est écrite sur 3 lignes car WsWin32 ne permet que 10 tags sur une même ligne.
La première valeur est celle de l'année en cours; elle est nulle si le mois n'est pas commencé.
Les suivantes sont les valeurs des années précédentes (n-1, n-2, ... jusqu'à n-20).
La station météo est en place depuis 2007 donc les années n-8 et suivantes sont inexistantes pour l'instant et remplacées par "--"
Voici où j'en suis :
var pluies_de_janvier = "0.0,86.6,42.0,28.0,51.0,26.6,74.6,"+
			"64.0,--,--,--,--,--,--,"+
			"--,--,--,--,--,--,--";
  function moyenne_pluie(pluie) {
	  pluie = pluie.substring(0,pluie.indexOf("-")-1);
if (pluie.substring(0,pluie.indexOf(",")) == "0.0")
{
	var pluie = pluie.substring(4);
};
 var n = pluie.length;
        var somme = 0;
        for(i=0; i<n; i++)
                somme += pluie[i];
        return somme/n;
  };
alert ("Moyenne de janvier : "+moyenne_pluie(pluies_de_janvier)+" mm" )

J'ai droit à un superbe NaN que je n'arrive pas à résoudre.
Pourriez-vous corriger mes erreurs, soit sur la construction de la variable, soit sur la fonction elle-même ... voire les deux !...
Cordialement

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut WakawaRider,

    Tu peux faire comme cela :

    var pluies_de_janvier = "0.0,86.6,42.0,28.0,51.0,26.6,74.6,"+
       "64.0,--,--,--,--,--,--,"+
       "--,--,--,--,--,--,--";
    function moyenne_pluie(pluie) {
      // suppression du 0.0 initial éventuel
      pluie = pluie.replace(/^0\.0,/,"");
      // capture des chiffres
      var myRe = /(\d+\.\d+)/g;
      var myArray = pluie.match(myRe);
      // calcul de la moyenne des précipitations
      // contenues dans le tableau myArray
      var moyenne = 0;
      for (var i=0; i<myArray.length; i++)
      {
        moyenne = moyenne  + Number(myArray[i]);
      }
      moyenne = moyenne / myArray.length;
      return moyenne;
    }
    alert ("Moyenne de janvier : "+moyenne_pluie(pluies_de_janvier)+" mm" ) 


    Dal
    2
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Il faudrait rajouter un
      if (myArray.length > 0)
      juste avant le
      moyenne = moyenne / myArray.length
      pour bien faire, histoire d'éviter les divisions par 0 :)
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      oui, merci
      0
    3. WakawaRider Messages postés 16 Statut Membre
       
      Merci de cette réponse rapide.

      J'ai intégré dans la fonction la remarque de Reivax962 ainsi que l'arrondi à1 chiffre après la virgule ce qui est suffisant pour cette valeur.
      Est-ce correct comme ça ?
      var pluies_de_janvier = "0.0,86.6,42.0,28.0,51.0,26.6,74.6,"+
         "64.0,--,--,--,--,--,--,"+
         "--,--,--,--,--,--,--";
      function moyenne_pluie(pluie) {
        // suppression du 0.0 initial éventuel
        pluie = pluie.replace(/^0\.0,/,"");
        // capture des chiffres
        var myRe = /(\d+\.\d+)/g;
        var myArray = pluie.match(myRe);
        // calcul de la moyenne des précipitations
        // contenues dans le tableau myArray
        var moyenne = 0;
        for (var i=0; i<myArray.length; i++)
        {
      	  if (myArray.length > 0) {
          moyenne = moyenne  + Number(myArray[i]);
      	  }
        }
        moyenne = (moyenne / myArray.length).toFixed(1);
        return moyenne;
      }
      alert ("Moyenne de janvier : "+moyenne_pluie(pluies_de_janvier)+" mm" )

      Puisque j'ai la chance d'avoir affaire à des interlocuteurs visiblement très compétents, je vous demande comment intégrer deux choses de plus dans cette fonction :
      - comment tenir compte du fait qu'il est possible qu'il ne pleuve pas cette année et les suivantes pendant le mois en cours, donc intégrer cette valeur nulle à la moyenne ?
      -Comment modifier la moyenne en ne tenant compte de la variable du mois en cours qu'à partir de la fin du mois seulement (disons le 28 du mois pour simplifier) pour ne pas fausser le résultat ?
      Merci par avance
      Cordialement
      0
    4. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Le if (myArray.length > 0) n'est pas au bon endroit !
        for (var i=0; i<myArray.length; i++)
        {
          moyenne = moyenne  + Number(myArray[i]);
        }
      if (myArray.length > 0) {
         moyenne = (moyenne / myArray.length).toFixed(1);
      }
      0
    5. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Bonjour,

      Dans le code "0.0" n'est ignoré dans le calcul que s'il est la première valeur sur la ligne. Dès lois, je ne comprends pas bien ce que tu veux faire.

      Le if (myArray.length > 0) devrait être placé autrement et avec un code d'erreur utile permettant à la fonction appelante de savoir que quelque chose s'est mal passé car on ne dispose d'aucun chiffre pour calculer la moyenne (par exemple en renvoyant -1).

        // calcul de la moyenne des précipitations
        // contenues dans le tableau myArray
        var moyenne = 0;
        if (myArray.length > 0) {
          for (var i=0; i<myArray.length; i++) {
            moyenne = moyenne  + Number(myArray[i]);
          }
          moyenne = (moyenne / myArray.length).toFixed(1);
        } else {
          // erreur, aucune précipitation détectée
          moyenne = -1;
        }
        return moyenne;


      Dal
      0