[Yii 1] Ayuda Java En Un Form

Hola, tengo esta funcion por el calculo del dos textfield en mi form y el resultado aparece en un 3 textFiel llamado totale:




    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js "></script>

 

<script>





// we used jQuery 'keyup' to trigger the computation as the user type

$('.diritti').keyup(function () {

 

    // initialize the sum (total price) to zero

    var sum = parseFloat($(this).val());

     

    // we use jQuery each() to loop through all the textbox with 'price' class

    // and compute the sum for each loop

    $('.prezzo').each(function() {

        

		

			sum += parseFloat($(this).val()*1.22);

    });

	

     

    // set the computed value to 'totalPrice' textbox

	$('#totale').val( sum.toFixed(2));

	

	

     

});

</script>



mi problema es que en el 3 textField si la suma de 0.53*1.22 es 6466 quiero que me ponga 0.65.

Ademas quiero que se un usuario inserta lettras y no numeros le salga un mensaje done se le dice "tienes que poner un numero".

Esto es el trozo de cogido de form:




      <td>

		<font color="#FFFFFF" style="margin-left:10px;"><b><?php echo $form->labelEx($model,'prezzo'); ?> €</b> 

		<?php echo $form->textField($model, 'prezzo',array('size'=>5,'readonly'=>true, 'class'=>'prezzo',));?></font>

		<?php echo $form->error($model,'prezzo'); ?>

        

		<font color="#FFFFFF"><b><?php echo $form->labelEx($model,'iva'); ?></b></font>

		<?php echo $form->textField($model,'iva', array('size'=>'5', 'id'=>'iva', 'value'=>'22%', 'readonly'=>true)); ?>

		<?php echo $form->error($model,'iva'); ?>


		<font color="#FFFFFF"><b><?php echo $form->labelEx($model,'diritti'); ?></b></font>

		<?php echo $form->textField($model,'diritti',array('size'=>5, 'class'=>'diritti', 'value'=>'0.00')); ?>

		<?php echo $form->error($model,'diritti'); ?>

	 </td>

     <td>

		<?php echo $form->labelEx($model,''); ?>

		<?php echo $form->textField($model,'totale', array('size'=>'5', 'id'=>'totale', 'readonly'=>true)); ?>

		<?php echo $form->error($model,'totale'); ?>

	</td>



Y esta es la funcion php que tengo en el form por el calculo de el precio:




<?php $peso = (int)$_POST['peso']; 




$prezzo = 9999.00;


if ($model->peso < 2001){

  $model->prezzo = 9.35;

  $model->totale = 9.35;

}


if ($model->peso < 1001){

  $model->prezzo = 7.20;

  $model->totale = 7.20*1.22;

}


if ($model->peso < 351){

  $model->prezzo = 5.85;

  $model->totale = 5.85*1.22;

}

if ($model->peso < 251){

  $model->prezzo = 5.25;

  $model->totale = 5.25*1.22;

}

if ($model->peso < 101){

  $model->prezzo = 4.85;

  $model->totale = 4.85*1.22;

}

if ($model->peso < 51){

  $model->prezzo = 4.60;

  $model->totale = 4.60*1.22;

}

if ($model->peso < 21){

  $model->prezzo = 0.53;

  $model->totale = 0.53*1.22;

  

}

?>



Por favor alguien tiene solucion a mi problma? :unsure: Gracias :)

Desculpen por mi espanol !!!

Buenas.

Lo de redondear los decimales lo tienes bien, se hace con toFixed().

Por ejemplo:




total = 2.347;


console.log(total.foFixed(2)); // Imprimirá 2.35 en la consola.



Y lo de restringir los caracteres, te creas esta función javascript:




function isDecimal(evento, obxeto)

{

    var caracteresValidos = ".0123456789";                                     // Caracteres válidos.

    var charCode = (evento.which) ? evento.which : evento.keyCode               //Recollemos o caracter insertado.


    if(charCode != 8 && charCode != 9)                        // Se non estamos borrando un caracter ou

                                                                                // tabulando.

    {

        charCode = String.fromCharCode(charCode);                               // Traducimos o código ó caracter.

        

        if(caracteresValidos.indexOf(charCode) == -1)                           // Se o caracter non é válido.

          return false;

        else                                                                    // Se o caracter é válido.

        {

            if((obxeto.value.indexOf(charCode)>-1 && charCode=='.') || 

                (charCode=='.' && obxeto.value.length==0))                      // Se xa existe unha coma ou o valor está baleiro.

                return false;

            else if((obxeto.value.indexOf(charCode)>-1 && charCode=='-') || 

                (charCode=='-' && obxeto.value.length>0))                       // Se xa existe un signo "-" ou o valor non está baleiro.

                return false;

        }    

    }   

}

Y en tu caja de texto añades:




...

'onkeypress'=>'return isDecimal(event, this)'

...



Un saludo.

Hola lagogz y gracias por tu respuesta.

He entendado hacerlo como dice tu pero no funciona. No redonda y sigue poniendo 0.6466 y no 0.65.

Pongo un escreen de la vista donde salen los datos. Y tambien te pego donde he puesto esa funcion y el onkeypress…

Function:




<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js "></script>

    

    <script type="text/javascript">

	   //Tronco i decimali a 2 numeri e arrotondo i millesimi

   function isDecimal(evento, obxeto)

{

    var caracteresValidos = ".0123456789";                                     // Caracteres válidos.

    var charCode = (evento.which) ? evento.which : evento.keyCode               //Recollemos o caracter insertado.


    if(charCode != 8 && charCode != 9)                        // Se non estamos borrando un caracter ou

                                                                                // tabulando.

    {

        charCode = String.fromCharCode(charCode);                               // Traducimos o código ó caracter.

        

        if(caracteresValidos.indexOf(charCode) == -1)                           // Se o caracter non é válido.

          return false;

        else                                                                    // Se o caracter é válido.

        {

            if((obxeto.value.indexOf(charCode)>-1 && charCode=='.') || 

                (charCode=='.' && obxeto.value.length==0))                      // Se xa existe unha coma ou o valor está baleiro.

                return false;

            else if((obxeto.value.indexOf(charCode)>-1 && charCode=='-') || 

                (charCode=='-' && obxeto.value.length>0))                       // Se xa existe un signo "-" ou o valor non está baleiro.

                return false;

        }    

    }   

}

</script>


 

<script>





// we used jQuery 'keyup' to trigger the computation as the user type

$('.diritti').keyup(function () {

 

    // initialize the sum (total price) to zero

    var sum = parseFloat($(this).val());

     

    // we use jQuery each() to loop through all the textbox with 'price' class

    // and compute the sum for each loop

    $('.prezzo').each(function() {

        

		

			sum += parseFloat($(this).val()*1.22);

    });

	

     

    // set the computed value to 'totalPrice' textbox

	$('#totale').val( sum.toFixed(2));

	

	

     

});

</script>



Onkeypress:




<font color="#FFFFFF"><b><?php echo $form->labelEx($model,'totale'); ?></b></font>

		<?php echo $form->textField($model,'totale', array('size'=>'5', 'id'=>'totale', 'onkeypress'=>'return isDecimal(event, this)'

, 'readonly'=>true)); ?>

		<?php echo $form->error($model,'totale'); ?>



Desculpa si ahora digo una tonteria…el onkeypress quiere decir que tendree que hacer un click?

Porque en el textField "totale" el precio (prezzo) apareche automáticamente por que con la funcion php recibe los datos del primer "step" de el form.

Tengo otra pregunta mas tambien. He visto que cuando hay un numero con 2 zeros final, exemplo 4.00 solo me muestra 4 y non 4.00. Como puedo arreglar esto tambien?

Y si quiero poner un alert en el java…por si un usuario inserta lettras de manera que le salga el mensaje "Tienes que poner numero" como puedo hacer?

Gracias por tu ayuda.

Un Saludo

Buenas, Gianni.

Pero vamos a ver alma de Dios!!!!

En tu código sólo te va a redondear cuando tu pulses una tecla dentro de la caja de "diritti", pq tienes programado el evento "keyup". Esto significa que cuando tengas seleccionada la caja de texto de "diritti" y pulses una tecla, en el momento de soltar la tecla se lanzará la función.

Tienes que hacer lo siguiente (adaptando los cálculos a lo que desees, veo que tendrás varias cajas prezzo, entonces haces el bucle):




<script>

function redondear() 

{

     var prezzo = $("#prezzo").val();

     var iva = $("#iva").val();

     var diritti = $("#diritti ").val();

     var sum = 0;


    if(prezzo.length == 0)

      prezzo = parseFloat(0);

    else

      prezzo = parseFloat(prezzo);


    if(iva.length == 0)

      iva= parseFloat(0);

    else

      iva= parseFloat(iva);


    if(diritti .length == 0)

      diritti = parseFloat(0);

    else

      diritti = parseFloat(diritti );


    sum = prezzo + iva + diritti;


    $('#totale').val(sum.toFixed(2));

};


$('.prezzo').onblur(function () 

{

    redondear;

});


$('.iva').onblur(function () 

{

    redondear;

});




$('.diritti').onblur(function () 

{

    redondear;

});

</script>



De esta forma, cada vez que una caja de texto pierda el foco, se te va a actualizar el total. Puedes utilizar cualquier otro evento, pero tienes que entender como funcionan. Por ejemplo podrías reemplazar "onblur" por "onkeypress", que significa que se lanzará la función cada vez que pulses una tecla estando la caja de texto seleccionada.

Por otro lado, si quieres que se muestre un aviso cuando la función "isDecimal" devuelva "false", le colocas un alert antes y listo. Por ejemplo:




function isDecimal(evento, obxeto)

{

....

if(caracteresValidos.indexOf(charCode) == -1)

{

     alert("Error 1");

     return false;

}

....

}



Para que un nº (por ejemplo 2) se muestre como 2.00, le aplicas toFixed(2) y listo.




<script>

     var numero = 2;


     alert(numero.toFixed(2));

</script>



Este código muestra 2.00.

IMPORTANTE!!!!

En mi opinión deberías utilizar ids en lugar de clases para las referencias jQuery. Por ejemplo para prezzo:




<?php echo $form->textField($model, 

               'prezzo', 

               array(

                    'id' => 'prezzo',

                    'size'=>5,

                    'readonly'=>true, 

                    'class'=>'prezzo',));?



Y así puedes utilizar $("#prezzo") en lugar de $(".prezzo").

Un saludo.

Hola lagogz y gracias por tu consejos. He ententado aplicar tu solucion pero no me funciona. Seguro me fallo yo en algunas cosas. Pero bueno he arreglado todo con otra solucion y del momento parece que todo funciona. Ententarè todabia aplicar tu solucion por que es mas completa de lo que he emplementado yo.