Bonjour,
J'ai un formulaire créé en PHP sur lequel je peux ajouter des prix sur toutes les cases en classe "price".
J'ai ensuite créé un javascript qui permet d'actualiser les prix inscrits par l'utilisateur , prix que j'ai du formater avec la fonction "number_format" trouvée sur http://phpjs.org/functions/number_format/
Cependant, lorsque le prix dépasse 1000, le prix total craque complétement... au lieu de m,'afficher 1200 par exemple il affiche 1.200 et donc la TVA ainsi que le prix total s'en retrouve totalement faussés.
Voici mon code :
// FUNCTION POUR FORMATER LES NOMBRES
function number_format (number, decimals, dec_point, thousands_sep) {
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
s = '',
toFixedFix = function (n, prec) {
var k = Math.pow(10, prec);
return '' + Math.round(n * k) / k;
};
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
}
// FUNCTION DE CALCUL DES PRIX
$(function(){
$('.price').change(function(){
priceActual = $(this).val();
if(isNaN(parseFloat($(this).val()))){
if(priceActual == null){
priceActual = "0";
}
if(priceActual != ""){
alert('Prix incorrect !');
return;
}
}
priceBrut = 0;
$(".price").each(function(){
if(!isNaN(parseFloat($(this).val()))){
priceBrut = parseFloat(priceBrut) + parseFloat($(this).val());
priceBrut = number_format (priceBrut, 2, '.', '')
}
});
$('#print_total_brut').attr('value', number_format(parseFloat(priceBrut)), 2, '.', '');
number_format($('#print_tva').attr('value', parseFloat($('#print_total_brut').val()) * 8.00 / 100),2,'.','');
number_format($('#print_total_net').attr('value', parseFloat($('#print_total_brut').val()) + parseFloat($('#print_tva').val())),2,'.','');
});
});
J'ai pourtant bien spécifié dans les arguments de la fonction que je veux seulement 2 chiffres après la virgule et que la séparation se fait avec un point et qu'il n'y a pas de séparation lors d'un milier (par exemple pour "10000" je veux qu'il reste à 10000 et non pas 10'000... bref).
Merci d'avance pour votre aide je bloque un peu...
Corrige tes 3 dernières lignes:
$('#print_total_brut').attr('value', number_format(parseFloat(priceBrut), 2, '.', ''));
$('#print_tva').attr('value', number_format(parseFloat($('#print_total_brut').val()) * 8.00 / 100,2,'.',''));
$('#print_total_net').attr('value', number_format(parseFloat($('#print_total_brut').val()) + parseFloat($('#print_tva').val()),2,'.',''));
Ta paranthèse est mal placée ici :
$('#print_total_brut').attr('value', number_format(parseFloat(priceBrut)), 2, '.', '');
C'est plutôt :
$('#print_total_brut').attr('value', number_format(parseFloat(priceBrut), 2, '.', ''));
Salut Antho,
J'ai corrigé le problème de parenthèse mais cela pose toujours problème.
Voici l'html correspond (Je ne mets que la partie qui sera calculée) :
<div class="form-group">
<?= $this->Form->text('prix_l1', ['class' => 'form-control price', 'id' => 'print_prix_l1']); ?>
</div>
C'est fait en cakePHP et bootstrap (Et toutes les lignes sont pareilles, simplement que les cases sont prix_l1, prix_l2 ... etc. Il y a 15 lignes en tout.
Une idée ? J'arrive faire en sorte que cela fonctionne , mais après les 2 chiffres après la virgule ne sont pas respectés...
Donc dans les 2 cas ça me pose problème.
Inspecte le code html généré et copie colle l'html plutôt, j"ai besoin de l'html pour reproduire en local le comportement et étudier l'anomalie.
Par ailleurs, si tu veux que chaque prix s'actualise =>
$(".price").each(function(){
if(!isNaN(parseFloat($(this).val()))){
priceBrut = parseFloat(priceBrut) + parseFloat($(this).val());
priceBrut = number_format (priceBrut, 2, '.', '')
$(this).val(number_format(parseFloat($(this).val()),2,".",""));
}
});
Ta solution était la bonne , j'avais simplement mal compris la fonction et mal positionné mes parenthèses... la honte.
Je te remercie Antho.
Cependant, mes prix s'actualisent, pourquoi devrais-je encore modifier le code , je ne comprends pas ?