Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Calcul instantané

17 réponses
Avatar
DamDamDeo
Bonjour =E0 tous,
je permets ce petit message, ceci afin de soliciter votre aide sur un
petit probl=E8me...

Voici mon formulaire (du moins une partie) :


[code]
<body>
<form name=3D"form1" method=3D"post" action=3D""><table width=3D"389"
border=3D"1">
<table width=3D"46%" border=3D"0" cellspacing=3D"2" cellpadding=3D"0">
<tr>
<td width=3D"29%">&nbsp;</td>
<td width=3D"22%"><div
align=3D"center"><strong>acteur</strong></div></td>
<td width=3D"25%"><div
align=3D"center"><strong>chanteur</strong></div></td>
<td width=3D"24%">total</td>
</tr>
<tr>
<td>Adultes</td>
<td>


<input name=3D"ch_acteur_adultes" type=3D"text"
id=3D"ch_acteur_adultes" size=3D"10" onchange=3D"add()"/


> </td>


<td>
<input name=3D"chanteur_adulte" type=3D"text"
id=3D"chanteur_adulte" size=3D"10" onchange=3D"add()"/>
</
td>
<td><input name=3D"total_adultes" type=3D"text"
id=3D"total_adultes" size=3D"10" style=3D"border:solid 2px #FF6600"
readonly=3D"true"/></td>
</tr>
<tr>
<td>De 12 &agrave; 18 ans</td>
<td>
<input name=3D"ch_acteur_18" type=3D"text"
id=3D"ch_acteur_18" size=3D"10" onchange=3D"add()"/> </
td>
<td>
<input name=3D"chanteur_18" type=3D"text"
id=3D"chanteur_18" size=3D"10" /> </td>
<td><input name=3D"total_18" type=3D"text"
id=3D"total_18" size=3D"10" style=3D"border:solid 2px #FF6600"
readonly=3D"true"/></td>
</tr>
<tr>
<td>Moins de 12 ans</td>
<td>
<input name=3D"ch_acteur_12" type=3D"text"
id=3D"ch_acteur_12" size=3D"10" onchange=3D"add()"/> </
td>
<td>
<input name=3D"chanteur_12" type=3D"text"
id=3D"chanteur_12" size=3D"10" /> </td>
<td>
<input name=3D"total_12" type=3D"text"
id=3D"total_12"
size=3D"10" style=3D"border:solid 2px #FF6600" readonly=3D"true"/

> </td>


</tr>
<tr>
<td>total</td>
<td><input name=3D"total_acteur" type=3D"text"
id=3D"total_acteur" size=3D"10" style=3D"border:solid 2px #FF6600"
readonly=3D"true"/></td>
<td><input name=3D"total_chanteur" type=3D"text"
id=3D"total_chanteur" size=3D"10" style=3D"border:solid 2px #FF6600"
readonly=3D"true"/></td>
<td><input name=3D"total" type=3D"text" id=3D"total"
size=3D"10" style=3D"border:solid 2px #FF6600" readonly=3D"true"/></td>
</tr>
</table>

</form>


</body>
[code]


Le but de ce formulaire est de calculer le nb d'adh=E9rents pour chaque
cat=E9gorie, et pour cela, j'utilise le petit script suivant :


[code]
<script type=3D"text/javascript">
function purge(nbre) {
// conversion s=E9parateur ',' en '.'
nbre =3D nbre.replace(',','.');
// recherche et remplacement de caract=E8res non d=E9sir=E9s
nbre =3D nbre.replace(/([^0-9 ^.]|\.{2,5}|\s)/g,'');
return nbre;


}


function add() {
var f =3D document.forms[0];
var tot =3D 0;
// pour chaque =E9l=E9ment du formulaire
for(var i=3D0; i<f.length; i++) {
// si c'est un champ de texte et dont le nom commence par 'ch_'
if(f[i].type=3D=3D'text' && f[i].name.indexOf('ch_')>=3D0) {
// correction du contenu du champ
f[i].value =3D purge(f[i].value);
// ajout de cette valeur =E0 la variable 'tot'
tot +=3D f[i].value*1;
// comme la valeur d'un champ est de type texte
// on l'a transform=E9e en nombre (en le multipliant par 1)
// avant de faire l'addition

}
}


// insertion du r=E9sultat
f['total_acteur'].value =3D tot;

}


</script>

[/code]


Mon soucis est que ce script ne me permet pas de faire plusieurs
calculs dans un m=EAme formulaire.
Comment rem=E9dier =E0 ce soucis qui commence =E0 me hanter depuis
plusieurs
jours maintenant.


D'avance merci,


DDD

10 réponses

1 2
Avatar
SAM

Mon soucis est que ce script ne me permet pas de faire plusieurs
calculs dans un même formulaire.
Comment remédier à ce soucis qui commence à me hanter depuis
plusieurs


<script type="text/javascript">

function purge(nbre) {
// conversion séparateur ',' en '.'
nbre = nbre.replace(',','.');
// recherche et remplacement de caractères non désirés
nbre = nbre.replace(/([^0-9 ^.]|.{2,5}|s)/g,'');
return nbre*1; // on renvoie un nombre
}

function nbr2txt(n) {
return n.toString().replace('.',',');
}

function add() {
var f = document.form1;
var k = f.length-3;
var tot1 = tot2 = 0;
var n1, n2;
for(var i=0; i<k; i = i+3) {
n1 = purge(f[i].value);
n2 = purge(f[i+1].value);
f[i+2].value = nbr2txt(+n1+n2);
tot1 += n1;
tot2 += n2;
}
f[k].value = nbr2txt(tot1);
f[k+1].value = nbr2txt(tot2);
f[k+2].value = nbr2txt(tot1+tot2);
}

</script>


--
sm

Avatar
DamDamDeo

<script type="text/javascript">

function purge(nbre) {
// conversion s�parateur ',' en '.'
nbre = nbre.replace(',','.');
// recherche et remplacement de caract�res non d�sirï¿ ½s
nbre = nbre.replace(/([^0-9 ^.]|.{2,5}|s)/g,'');
return nbre*1; // on renvoie un nombre
}

function nbr2txt(n) {
return n.toString().replace('.',',');
}

function add() {
var f = document.form1;
var k = f.length-3;
var tot1 = tot2 = 0;
var n1, n2;
for(var i=0; i<k; i = i+3) {
n1 = purge(f[i].value);
n2 = purge(f[i+1].value);
f[i+2].value = nbr2txt(+n1+n2);
tot1 += n1;
tot2 += n2;
}
f[k].value = nbr2txt(tot1);
f[k+1].value = nbr2txt(tot2);
f[k+2].value = nbr2txt(tot1+tot2);
}

</script>


--
sm



Merci beaucoup, ça marche impec ;)

Avatar
DamDamDeo

<script type="text/javascript">

function purge(nbre) {
// conversion séparateur ',' en '.'
nbre = nbre.replace(',','.');
// recherche et remplacement de caractères non désirés
nbre = nbre.replace(/([^0-9 ^.]|.{2,5}|s)/g,'');
return nbre*1; // on renvoie un nombre

}

function nbr2txt(n) {
return n.toString().replace('.',',');

}

function add() {
var f = document.form1;
var k = f.length-3;
var tot1 = tot2 = 0;
var n1, n2;
for(var i=0; i<k; i = i+3) {
   n1 = purge(f[i].value);
   n2 = purge(f[i+1].value);
   f[i+2].value = nbr2txt(+n1+n2);
   tot1 += n1;
   tot2 += n2;
   }
f[k].value = nbr2txt(tot1);
f[k+1].value = nbr2txt(tot2);
f[k+2].value = nbr2txt(tot1+tot2);

}

</script>

--
sm


Désolé de revenir à la charge, mais ce dresse devant moi un nouveau
problème.
En effet, ma page comporte de nombreux champs et donc de nombreux
calcul (uniquement des additions),
n'y a-t-il pas un moyen pour définir une fonction plus générale, dans
le sens on définirait les champs à additionner uniquement dans mes
divers champs total.
(je sais pas si je suis très clair)

en gros on a :

<input name="ch_acteur_18" type="text" id="ch_acteur_18" size="10" / >
<input name="ch_acteur_15" type="text" id="ch_acteur_15" size="10" / >
<input name="ch_acteur_12" type="text" id="ch_acteur_12" size="10" / >

<input name="total_acteur" type="text" id="total_acteur" size="10"
"additione moi les input"ch_ateur_18;ch_acteur_15;ch_acteur_12"/>

<input name="ch_chanteur_18" type="text" id="ch_chanteur_18"
size="10" />
<input name="ch_chanteur_15" type="text" id="ch_chanteur_15"
size="10" />
<input name="ch_chanteur_12" type="text" id="ch_chanteur_12"
size="10" />

<input name="total_chanteur" type="text" id="total_acteur" size="10"
"additione moi les input"ch_chanteur_18;ch_chanteur_15;ch_chanteur_12"/



<input name="total_chanteur" type="text" id="total_acteur" size="10"
"additione moi les input"total_chanteur;total_acteur"/>

Je ne sais pa si c'est réalisable,
en tout cas merci un grand merci quand même pour ce début de
réponse ;)

Avatar
SAM

Désolé de revenir à la charge, mais ce dresse devant moi un nouveau
problème.
En effet, ma page comporte de nombreux champs et donc de nombreux
calcul (uniquement des additions),
n'y a-t-il pas un moyen pour définir une fonction plus générale, dans
le sens on définirait les champs à additionner uniquement dans mes
divers champs total.
(je sais pas si je suis très clair)


ben, à ce moment là tu peux faire soit une fonction pas trop futée :

function add(prefix, nums) {
var f = document.form1;
nums = nums.split();
var tot = 0;
for(var i=0; i<nums.length; i++) tot += purge(f[prefix+num[i].value);
f[prefix+'total'].value = nbr2txt(tot);
}

<input tabindex=1 name="ch_acteur_18" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=2 name="ch_acteur_15" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=3 name="ch_acteur_12" type="text"
onchange="add('ch_acteur_', '12,15,18')" />

<input name="ch_acteur_total" />

<input tabindex=4 name="ch_chanteur_18" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=5 name="ch_chanteur_15" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=6 name="ch_chanteur_18" type="text"
onchange="add('ch_acteur_', '12,15,18')"/>

<input name="ch_chanteur_total" />

- si on n'a pas l'usage des id, autant s'en passer
- pour la taille des champs, hop! CSS --> input { width: 50px }
- type="text" est facultatif (c'est l'état par défaut des inputs)


Soit une fonction un peu + compliquée :

<html>
<script type="text/javascript">
function purge(nbre) {
nbre = nbre.replace(',','.');
nbre = nbre.replace(/([^0-9 ^.]|.{2,5}|s)/g,'');
return nbre*1; // on renvoie un nombre
}

function nbr2txt(n) {
return n.toString().replace('.',',');
}

function add(quoi) {
var t = quoi.parentNode;
while(t.tagName != 'TR') t = t.parentNode; // rangée contenant l'input
t = t.getElementsByTagName('INPUT'); // collection des inputs de ce rang
var L = t.length-1;
var n = 0;
for(var i=0; i<L; i++) n += purge(t[i].value); // addition des input
t[L].value = nbr2txt(n); // hop en nombre avec ','
}
</script>

<style type="text/css">
input { width: 5em; text-align: center }
input:focus { background: #ffc }
th input { border-color: red }
</style>

<table>
<tr>
<td><input tabindex="1" name="ch_act_18" onchange="add(this)" /></td>
<td><input tabindex="2" name="ch_act_15" onchange="add(this)" /></td>
<td><input tabindex="3" name="ch_act_12" onchange="add(this)" /></td>
<td><input tabindex="3" name="ch_act_28" onchange="add(this)" /></td>
<th><input name="ch_act_total" /></th>
</tr>
<tr>
<td><input tabindex="4" name="ch_chant_18" onchange="add(this)" /></td>
<td><input tabindex="5" name="ch_chant_15" onchange="add(this)" /></td>
<td><input tabindex="6" name="ch_chant_12" onchange="add(this)" /></td>
<td><input tabindex="6" name="ch_chant_28" onchange="add(this)" /></td>
<th><input name="ch_chant_total" /></th>
</tr>
</table>
</html>


ne reste qu'à additionner les rangées ... :-)

--
sm

Avatar
DamDamDeo
On 9 mai, 23:12, SAM
wrote:


ben, à ce moment là tu peux faire soit une fonction pas trop futée :

function add(prefix, nums) {
var f = document.form1;
nums = nums.split();
var tot = 0;
for(var i=0; i<nums.length; i++) tot += purge(f[prefix+num[i].value);
f[prefix+'total'].value = nbr2txt(tot);

}

<input tabindex=1 name="ch_acteur_18" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=2 name="ch_acteur_15" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=3 name="ch_acteur_12" type="text"
onchange="add('ch_acteur_', '12,15,18')" />

<input name="ch_acteur_total" />

<input tabindex=4 name="ch_chanteur_18" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=5 name="ch_chanteur_15" type="text"
onchange="add('ch_acteur_', '12,15,18')" />
<input tabindex=6 name="ch_chanteur_18" type="text"
onchange="add('ch_acteur_', '12,15,18')"/>

<input name="ch_chanteur_total" />

- si on n'a pas l'usage des id, autant s'en passer
- pour la taille des champs, hop! CSS --> input { width: 50px }
- type="text" est facultatif (c'est l'état par défaut des inputs)

Soit une fonction un peu + compliquée :

<html>
<script type="text/javascript">
function purge(nbre) {
nbre = nbre.replace(',','.');
nbre = nbre.replace(/([^0-9 ^.]|.{2,5}|s)/g,'');
return nbre*1; // on renvoie un nombre

}

function nbr2txt(n) {
return n.toString().replace('.',',');

}

function add(quoi) {
var t = quoi.parentNode;
while(t.tagName != 'TR') t = t.parentNode; // rangée contenant l'i nput
t = t.getElementsByTagName('INPUT'); // collection des inputs de ce rang
var L = t.length-1;
var n = 0;
for(var i=0; i<L; i++) n += purge(t[i].value); // addition des input
t[L].value = nbr2txt(n); // hop en nombre avec ',' }

</script>

<style type="text/css">
input { width: 5em; text-align: center }
input:focus { background: #ffc }
th input { border-color: red }
</style>

<table>
<tr>
<td><input tabindex="1" name="ch_act_18" onchange="add(this)" /></td >
<td><input tabindex="2" name="ch_act_15" onchange="add(this)" /></td >
<td><input tabindex="3" name="ch_act_12" onchange="add(this)" /></td >
<td><input tabindex="3" name="ch_act_28" onchange="add(this)" /></td >
<th><input name="ch_act_total" /></th>
</tr>
<tr>
<td><input tabindex="4" name="ch_chant_18" onchange="add(this)" /></ td>
<td><input tabindex="5" name="ch_chant_15" onchange="add(this)" /></ td>
<td><input tabindex="6" name="ch_chant_12" onchange="add(this)" /></ td>
<td><input tabindex="6" name="ch_chant_28" onchange="add(this)" /></ td>
<th><input name="ch_chant_total" /></th>
</tr>
</table>
</html>

ne reste qu'à additionner les rangées ... :-)

--
sm


Milles merci,
ça marche impec !
Un immense merci !

Juste une dernière chose (je suis vraiment un boulet), avec la
deuxième méthode, j'arrive à calculer mes lignes horizontales, mais
pas les lignes verticales.
Encore un dernier petit coup de main ?

Encore merci.

Avatar
SAM
Milles merci,
ça marche impec !


Non, la soluce 1, telle que, ne doit pas bien fonctionner.

Un immense merci !


J'espère seulement que tu comprends ce qui est bidouillé ?
Sinon il faut demander.

Juste une dernière chose (je suis vraiment un boulet), avec la
deuxième méthode, j'arrive à calculer mes lignes horizontales, mais
pas les lignes verticales.
Encore un dernier petit coup de main ?


J'ai dit : ne reste plus qu'à additionner les rangées.

Je dis maintenant : comment comptes-tu t'y prendre ?

Encore merci.


Indices :
- la longueur de la collection d'input
(ici = le nbre d'éléments du formulaire)
- le nombre de rangées
(et par le fait, le nbre d'input par rangée)

Avatar
DamDamDeo
On 10 mai, 04:01, SAM
wrote:

Milles merci,
ça marche impec !


Non, la soluce 1, telle que, ne doit pas bien fonctionner.

Un immense merci !


J'espère seulement que tu comprends ce qui est bidouillé ?
Sinon il faut demander.

Juste une dernière chose (je suis vraiment un boulet), avec la
deuxième méthode, j'arrive à calculer mes lignes horizontales, mai s
pas les lignes verticales.
Encore un dernier petit coup de main ?


J'ai dit : ne reste plus qu'à additionner les rangées.

Je dis maintenant : comment comptes-tu t'y prendre ?

Encore merci.


Indices :
- la longueur de la collection d'input
   (ici = le nbre d'éléments du formulaire)
- le nombre de rangées
   (et par le fait, le nbre d'input par rangée)


Je comprend globalement ce qui se passe :
"additionne tous les nombres contenu dans la rangé et affiche le
résultat dans le dernier input de cette rangé"
(heu j'ai bon ?)

mais très sincèrement, de là à essayé de refaire quelque chose da ns
le même style pour qu'en plus de calculer des rangés on puisse aussi
calculer des colonnes, y'a pour moi un grand fossé.


Avatar
DamDamDeo
On 10 mai, 04:01, SAM
wrote:

Milles merci,
ça marche impec !


Non, la soluce 1, telle que, ne doit pas bien fonctionner.

Un immense merci !


J'espère seulement que tu comprends ce qui est bidouillé ?
Sinon il faut demander.

Juste une dernière chose (je suis vraiment un boulet), avec la
deuxième méthode, j'arrive à calculer mes lignes horizontales, mai s
pas les lignes verticales.
Encore un dernier petit coup de main ?


J'ai dit : ne reste plus qu'à additionner les rangées.

Je dis maintenant : comment comptes-tu t'y prendre ?

Encore merci.


Indices :
- la longueur de la collection d'input
   (ici = le nbre d'éléments du formulaire)
- le nombre de rangées
   (et par le fait, le nbre d'input par rangée)


Je comprend globalement ce qui se passe :
"additionne tous les nombres contenu dans la rangé et affiche le
résultat dans le dernier input de cette rangé"
(heu j'ai bon ?)

mais très sincèrement, de là à essayé de refaire quelque chose da ns
le même style pour qu'en plus de calculer des rangés on puisse aussi
calculer des colonnes, y'a pour moi un grand fossé.


Avatar
SAM
On 10 mai, 04:01, SAM
wrote:

J'espère seulement que tu comprends ce qui est bidouillé ?
Sinon il faut demander.


Je comprend globalement ce qui se passe :
"additionne tous les nombres contenu dans la rangé et affiche le
résultat dans le dernier input de cette rangé"
(heu j'ai bon ?)


oui :-)

mais très sincèrement, de là à essayé de refaire quelque chose dans
le même style pour qu'en plus de calculer des rangés on puisse aussi
calculer des colonnes, y'a pour moi un grand fossé.


Il faut s'inspirer du premier jus.

on crée un tableau (un array) des sous-totaux par colonne
var tot = new Array(); // ou : tot = [];
on crée une variable pour le sous-total de la rangée
var sstot = 0;

on commence par relever le nombre d'inputs
var c = document.form1.length;
puis le nombre de rangées
var r = document.getElementsByTagName('TR');
ce qui nous donne le nombre de colonnes :
var n = c/r;

on peut alors créer les sous-totaux par colonnes (sauf la dernière)
for(var i=0; i<n-1; i++) tot[i] = 0;

ensuite on fait une boucle sur les rangées sauf la dernière des totaux
la boucle a pour pas : n (on saute de n cellules en n cellules)
for(var i=0; i<(c-n); i = i+n) {

dans cette boucle on fait une boucle sur les inputs de la rangée
for(var j=0; j<(n-1); j++) {
addition de chaque input dans sous-total de rangée
sstot += f[i+j].value*1;
addition de chaque input dans sous-total de colonne
tot[i] += f[i+j].value*1;
fin de sous-boucle

on dispose le sous-total de la rangée
f[i+n-1].value = sstot;
on remet à zéro le sous-total de rangée pour le prochain passage (i+n)
sstot = 0;

enfin il ne reste plus qu'à réaliser la boucle sur la dernière rangée
des totaux généraux
( les cellules ou inputs depuis f[c-n] à f[c-2] )
( rappel : les inputs vont de f[0] à f[c-1] )
pour entrer les résultats des sous-totaux par colonnes puis le total de
la rangée
sstot = 0;
for(var i=0; i<n-1; i++) {
f[c-n+i]. value = ...


Voili, voilou

Le truc complet est prèt, je te le donne dès que tu m'as montré tes
tentatives.

--
sm


Avatar
DamDamDeo
On 10 mai, 12:35, SAM
wrote:

On 10 mai, 04:01, SAM
wrote:

J'espère seulement que tu comprends ce qui est bidouillé ?
Sinon il faut demander.


Je comprend globalement ce qui se passe :
"additionne  tous les nombres contenu dans la rangé et affiche le
résultat dans le dernier input de cette rangé"
(heu j'ai bon ?)


oui :-)

 mais très sincèrement, de là à essayé de refaire quelque ch ose dans
le même style pour qu'en plus de calculer des rangés on puisse aussi
calculer des colonnes, y'a pour moi un grand fossé.


Il faut s'inspirer du premier jus.

on crée un tableau (un array) des sous-totaux par colonne
   var tot = new Array();    // ou : tot = [];
on crée une variable pour le sous-total de la rangée
   var sstot = 0;

on commence par relever le nombre d'inputs
   var c = document.form1.length;
puis le nombre de rangées
   var r = document.getElementsByTagName('TR');
ce qui nous donne le nombre de colonnes :
   var n = c/r;

on peut alors créer les sous-totaux par colonnes (sauf la dernière)
   for(var i=0; i<n-1; i++) tot[i] = 0;

ensuite on fait une boucle sur les rangées sauf la dernière des totaux
la boucle a pour pas : n  (on saute de n cellules en n cellules)
   for(var i=0; i<(c-n); i = i+n) {

dans cette boucle on fait une boucle sur les inputs de la rangée
      for(var j=0; j<(n-1); j++) {
        addition de chaque input dans sous-total de rangée
          sstot += f[i+j].value*1;
        addition de chaque input dans sous-total de colonne
          tot[i] += f[i+j].value*1;
        fin de sous-boucle

on dispose le sous-total de la rangée
     f[i+n-1].value = sstot;
on remet à zéro le sous-total de rangée pour le prochain passage (i+ n)
     sstot = 0;

enfin il ne reste plus qu'à réaliser la boucle sur la dernière rang ée
des totaux généraux
    ( les cellules ou inputs depuis f[c-n] à f[c-2] )
    ( rappel : les inputs vont de f[0] à f[c-1] )
pour entrer les résultats des sous-totaux par colonnes puis le total de
la rangée
     sstot = 0;
     for(var i=0; i<n-1; i++) {
       f[c-n+i]. value = ...

Voili, voilou

Le truc complet est prèt, je te le donne dès que tu m'as montré tes
tentatives.

--
sm


Et bien voici ce que j'avais déjà pu faire grace à vous :
http://madafraf.ovh.org/formulaire_omlc/formu_omlc.html (voir l'onglet
effectif)



1 2