Ayuda con 2 scripts

Hola experto, sin querer ser pesado, a ver si me puedes echar una manita con un par de scripts que me están dando problemas. El primero es el siguiente:
<html>
<head>
<title></title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<SCRIPT LANGUAGE=JavaScript>
function Sumar() {
var val1;
var val2;
var val3;
val1 = (! ParseFloat(document.factura.sum1.value))?0:parseFloat(document.factura.sum1.value);
val2 = (! ParseFloat(document.factura.sum2.value))?0:parseFloat(document.factura.sum2.value);
val3 = (! ParseFloat(document.factura.sum3.value))?0:parseFloat(document.factura.sum3.value);
document.factura.tot.value = val1 * (val2 * 1.38 + val3 * 1.1);
}
</SCRIPT>
<form name=factura>
<tr><td><input type=text value="Item 1"></td>
<td><input name=sum1 size=5 onChange=Sumar()></td>
</tr>
<tr><td><input type=text value="Item 2"></td>
<td><input name=sum2 size=5 onChange=Sumar()></td>
</tr>
<tr><td><input type=text value="Item 3"></td>
<td><input name=sum3 size=5 onChange=Sumar()></td>
</tr>
<tr><td align=right><input type=button value="Total:" onClick=Sumar()></td>
<td><input name=tot size=6></td>
</tr>
</form>
</body>
</html>
Todo funciona bien, pero dependiendo de la multiplicación, hay veces que el resultado es, por ej., 12,59999999999 ¿Cómo seria el script para que redondease a 2 decimales unicamente? El otro script con el que me estoy peleando es el siguiente:
<html>
<head>
<title></title>
<script language="javascript">
function contar() {
var checkboxes = formulario.checkbox; //Array que contiene los checkbox
var cont = 0; //Variable que lleva la cuenta de los checkbox pulsados
for (var x=0; x < checkboxes.length; x++) {
if (checkboxes[x].checked) {
cont = cont + 1;
}
}
formulario.uno.value = cont;
}
</script>
<script language="javascript">
function contar() {
var checkboxes = formulario.checkbox2; //Array que contiene los checkbox
var cont = 0; //Variable que lleva la cuenta de los checkbox pulsados
for (var x=0; x < checkboxes.length; x++) {
if (checkboxes[x].checked) {
cont = cont + 1;
}
}
formulario.dos.value = cont;
}
</script>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form name="formulario" method="post" action="">
<input type="checkbox" name="checkbox"
onClick="contar();">
<input type="checkbox" name="checkbox"
onClick="contar();">
<input type="checkbox" name="checkbox"
onClick="contar();">
<input type="checkbox" name="checkbox2"
onClick="contar();">
<input type="checkbox" name="checkbox2"
onClick="contar();">
<input type="checkbox" name="checkbox2"
onClick="contar();">
<br>
<input type="text" name="dia" size="10">
<br>
<input type="text" name="uno" size="10">
<br>
</form>
</body>
</html>
El problema es que lo que quiero es que cuente los checkbox en dos grupos, por un lado los que se llamen checkbox y por otro los que se llamen checkbox2, pero no lo consigo, solo me cuenta 1 de los grupos, y el otro lo ignora. ¿Dónde está el error? ¿Cómo seria el código para conseguirlo? Muchiiisimas gracias

6 Respuestas

Respuesta
1
Aquí te mando el código de una función javascript que te redondea un numero(value) con los de decimales que tu quieras(precisión).
function roundOff(value,precision)
{
value = "" + value
precision = parseInt(precision);
var whole = "" + Math.round(value * Math.pow(10, precision));
var decPoint = whole.length - precision;
if(decPoint != 0)
{
result = whole.substring(0, decPoint);
result += ".";
result += whole.substring(decPoint, whole.length);
}
else
{
result = whole;
}
return result;
}
Lo de los checkboxes, te mando el código tuyo retocado. A mi me ha funcionado, pruébalo a ver si es eso lo que quieres que haga.
<html>
<head>
<title></title>
<script language="javascript">
function contar() {
var checkboxes = formulario.checkbox; //Array que contiene los checkbox
var cont = 0; //Variable que lleva la cuenta de los checkbox pulsados
for (var x=0; x < checkboxes.length; x++) {
if (checkboxes[x].checked) {
cont = cont + 1;
}
}
formulario.uno.value = cont;
}
</script>
<script language="javascript">
function contar1() {
var checkboxes = formulario.checkbox2; //Array que contiene los checkbox
var cont = 0; //Variable que lleva la cuenta de los checkbox pulsados
for (var x=0; x < checkboxes.length; x++) {
if (checkboxes[x].checked) {
cont = cont + 1;
}
}
formulario.dos.value = cont;
}
</script>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form name="formulario" method="post" action="">
<input type="checkbox" name="checkbox"
onClick="contar();">
<input type="checkbox" name="checkbox"
onClick="contar();">
<input type="checkbox" name="checkbox"
onClick="contar();">
<input type="checkbox" name="checkbox2"
onClick="contar1();">
<input type="checkbox" name="checkbox2"
onClick="contar1();">
<input type="checkbox" name="checkbox2"
onClick="contar1();">
<br>
<input type="text" name="uno" size="10">
<br>
<input type="text" name="dos" size="10">
<br>
</form>
</body>
</html>
Respuesta
1
Como estas, no te preocupes por preguntar que todos hemo necesitado ayuda alguna vez.
Respecto al primero de los scripts, es bastante sencilla la solución, tienes que usar una función especifica de javascript que es la siguiente:
Math. Round(a,b)
Donde a es el valor a redondear, y b es el numero de decimales que quieres.
En el segundo de los scripts, creo que el fallo esta en una tontería y es la siguiente...
Las dos funciones javascript las has llamado de la misma manera, por lo que cuando la invocas, el explorador solo procederá a ejecutar una de ellas, la otra simplemente la ignorara. Cambiale el nombre a la función y desde la función Contar(), en la ultima linea de código invoca a la otra función, por ejemplo Contar2(), y ya veras como te funciona.
Nada más, un saludo y suerte de nuevo. No te preocupes por preguntar que para eso estamos aquí.
David Jimenez
Hola david. Gracias por responder tan pronto. Sobre el primer script, ¿donde pongo lo de Math.Round(a, b) dentro de mi código? Es que no se donde ponerlo.
En cuanto a la segunda duda, ya había probado lo que me has dicho, y no me salia. Al volvérmelo a decir, lo he repasado todo, y me he dado cuenta de que en los checkbox2 ponía contar, y claro, debe poner contar2, que es la nueva función. Lo he cambiado y todo ok. A ver si me explicas lo de el primer script. Muchas gracias.
Como estas, te comento como usar esta función, que no usa dos parámetros, sino uno(se me fue el dedo).
Entonces, para usar la función en este caso debes de poner lo siguiente:
mynum=val1 * (val2 * 1.38 + val3 * 1.1);
mynum=Math.round(mynum*Math.pow(10,NUMDECIMALS))/Math.pow(10,NUMDECIMALS);
document.factura.tot.value=mynum;
Donde el valor NUMDECIMALS representa el numero de decimales que quieres tener en el resultado.
Pruébalo y ya veras como te funciona, acuérdate de lo de la diferencia entre los puntos y las comas en los decimales para que te funcione bien.-
David, lo he puesto así y no funciona:
<html>
<head>
<title></title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<SCRIPT LANGUAGE=JavaScript>
function Sumar() {
var val1;
var val2;
var val3;
val1 = (! parseFloat(document.factura.sum1.value))?0:parseFloat(document.factura.sum1.value);
val2 = (! parseFloat(document.factura.sum2.value))?0:parseFloat(document.factura.sum2.value);
val3 = (! parseFloat(document.factura.sum3.value))?0:parseFloat(document.factura.sum3.value);
mynum = val1 * (val2 * 1.38 + val3 * 1.1);
mynum = Math.round(mynum*Math.pow(10,NUMDECIMALS))/Math.pow(10,NUMDECIMALS);
document.factura.tot.value = mynum;
}
</SCRIPT>
<form name=factura>
<tr><td><input type=text value="Item 1"></td>
<td><input name=sum1 size=5 onChange=Sumar()></td>
</tr>
<tr><td><input type=text value="Item 2"></td>
<td><input name=sum2 size=5 onChange=Sumar()></td>
</tr>
<tr><td><input type=text value="Item 3"></td>
<td><input name=sum3 size=5 onChange=Sumar()></td>
</tr>
<tr><td align=right><input type=button value="Total:" onClick=Sumar()></td>
<td><input name=tot size=6></td>
</tr>
</form>
</body>
</html>
¿He puesto algo mal?
De nuevo Pedroche, la verdad es que no has puesto casi nada mal, solo una pequeña cosa que te debe de dar un error.
En el código que yo te he pasado tienes un liteal que pone NUMDECIMALS, y esto lo tienes que sustituir en las dos ocurrencias por el numero de decimales que quieras tener en ese resultado, en tu caso, si no recuerdo mal es dos, por lo que debería de quedar así:
mynum=Math.round(mynum*Math.pow(10,2))/Math.pow(10,2);
Nada más, haz este cambio y ya veras como te funciona.
Respuesta
1
La primera función, para que te redondee dos decimales sería así:
function Sumar() {
var val1;
var val2;
var val3;
val1 = (! parseFloat(document.factura.sum1.value))?0:parseFloat(document.factura.sum1.value);
val2 = (! parseFloat(document.factura.sum2.value))?0:parseFloat(document.factura.sum2.value);
val3 = (! parseFloat(document.factura.sum3.value))?0:parseFloat(document.factura.sum3.value);
resultado = val1 * (val2 * 1.38 + val3 * 1.1); //definimos resultado
resultado = resultado * 100 //pasamos por ejemplo 2 decimales a la dcha (por 100)
resultado = Math.round(resultado); //redondeamos resultado
resultado = resultado / 100 //deshacemos los cambios de multiplicar por 100
document.factura.tot.value = resultado;
}
Para que la segunda función sea operativa, debes hacer checkbox y checkbox2 por separado, pero en la misma función:
<html>
<head>
<title></title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<script language="javascript">
function contar() {
var checkboxes = formulario.checkbox; //Array con los checkbox
var checkboxes2 = formulario.checkbox2; //Array con los checkbox2
var cont = 0; //checkbox pulsados
var cont2 = 0; //checkbox2 pulsados
for (var x=0; x < checkboxes.length; x++) {
if (checkboxes[x].checked) {
cont = cont + 1;
}
}
for (var y=0; y < checkboxes2.length; y++) {
if (checkboxes2[y].checked) {
cont2 = cont2 + 1;
}
}
formulario.uno.value = cont;
formulario.dos.value = cont2;
}
</script>
<form name="formulario" method="post" action="">
<input type="checkbox" name="checkbox" onClick="contar();"><br>
<input type="checkbox" name="checkbox" onClick="contar();"><br>
<input type="checkbox" name="checkbox" onClick="contar();"><br>
<input type="checkbox" name="checkbox2" onClick="contar();"><br>
<input type="checkbox" name="checkbox2" onClick="contar();"><br>
<input type="checkbox" name="checkbox2" onClick="contar();"><br>
<br><br>
<input type="text" name="uno" size="10" value="0">
<br>
<input type="text" name="dos" size="10" value="0">
<br>
</form>
</body>
</html>
Las he probado las dos y a mi me funcionan.
Respuesta
1
No eres pesado, ya me gustaría que todo el mundo propusiera dudas tan interesantes como las tuyas, y no la típica de "como hago para que cambie de color el botón cuando..." penas de mi vida aparte:
1º Existe una función de la clase Math que se llama round, se usaría: tot=round(tot); el problema es que te machaka los decimales pues redondea al entero más cercano (pierdes los preciados decimales y toda la precisión)... ¿solución? Convertir el número a string, cortar la parte decimal, pasarla a entero y redondearla, luego concatenarla con la parte entera que teníamos y convertir la cadena a float que es el formato que usas. En teoría es posible hacerlo, en teoría...
2º ¿Has probado a cambiar el nombre de la segunda función a contar2() y luego en los checkbox correspondientes hacer que apunten también a esa función?, tal y como esta el código sólo se tiene en cuenta la primera definición de contar(), que curiosamente coincide con el cálculo de los checkbox(1) (los únicos que dices te calcula), no lo he probado, pero estoy seguro al 90% que ese es el problema.
Hasta lego! ;)
P.D. no seas roña con los puntos! XDD
Un saludo, ante todo. El segundo script ya lo había solucionado antes de recibir tu respuesta y, efectivamente, debía cambiar el nombre del función y de los checkbox para que pusiese en ellos onclick=contar2(), pero el primer sigo sin haberlo solucionado. Otro experto me ha dicho que lo ponga así:
<html>
<head>
<title></title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<SCRIPT LANGUAGE=JavaScript>
function Sumar() {
var val1;
var val2;
var val3;
val1 = (! parseFloat(document.factura.sum1.value))?0:parseFloat(document.factura.sum1.value);
val2 = (! parseFloat(document.factura.sum2.value))?0:parseFloat(document.factura.sum2.value);
val3 = (! parseFloat(document.factura.sum3.value))?0:parseFloat(document.factura.sum3.value);
mynum = val1 * (val2 * 1.38 + val3 * 1.1);
mynum = Math.round(mynum*Math.pow(10,NUMDECIMALS))/Math.pow(10,NUMDECIMALS);
document.factura.tot.value = mynum;
}
</SCRIPT>
<form name=factura>
<tr><td><input type=text value="Item 1"></td>
<td><input name=sum1 size=5 onChange=Sumar()></td>
</tr>
<tr><td><input type=text value="Item 2"></td>
<td><input name=sum2 size=5 onChange=Sumar()></td>
</tr>
<tr><td><input type=text value="Item 3"></td>
<td><input name=sum3 size=5 onChange=Sumar()></td>
</tr>
<tr><td align=right><input type=button value="Total:" onClick=Sumar()></td>
<td><input name=tot size=6></td>
</tr>
</form>
</body>
</html>
Pero este ni siquiera multiplica. ¿Ves dónde puede estar el fallo? Contestame con lo que sea, aunque no lo sopes, y al recibir tu respuesta te puntúo por lo anterior (es que no puedo puntuarte y volver a preguntarte a la vez, como sabrás)
Debes indicar un valor para NUMDECIMALS, sino no rula. En este ejemplo reemplazo esa variable por un numero fijo (2), cárgalo y veras como funciona.
<script>
mynum = 10/3;
alert ("sin redondeo: "+mynum);
mynum = Math.round(mynum*Math.pow(10,2))/Math.pow(10,2);
alert ("con redondeo: "+mynum);
</script>
Ok, ya lo solucione, era eso, que había que poner un numero en vea de NUMDECIMALES. Llegaste un poco tarde, pero todas tus respuestas han sido correctas y te lo has trabajado
Respuesta
1
De nuevo amigo.
1.- Respecto a truncar o redondear un número a n posiciones decimales:
Lo mejor que puedes hacer es emplear un truco que consiste en multiplicar por 100 la cantidad, redondear el número y una vez redondeado divides de 100. Serial algo como
valor=Math.round(valor*100)/100
2.- Respecto al sefgundo script, me he tomado la libertad de modificarlo un poco:
La función contar ahora lo que hace es,:
A.- Inicializa los contadores contá y contB a cero.
B.- Cuenta todos los campos del formulario y los almacena en la variable campos.
C.- Recorrero todos los campos del formulario.
D.- Si no son de tipo checkbox pasa de largo
E.- Si son checkbox comprueba el nombre y el estado para aumentar los contadores
En el ejemplo los campos pueden ser llamados "tipoA" y "tipoB".
En el ejemplo he puesto que muestre los valores en el último campo del formulario.
El código ahora es:
<html>
<head>
<title></title>
<script language="javascript">
function contar()
{
var contA=0
var contB=0
var campos=formulario.elements.length
for (var x=0; x<campos; x++)
{
var campo=formulario.elements[x]
if (campo.type=="checkbox")
{
if (campo.name=="tipoA" && campo.checked) {contA=contA+1}
if (campo.name=="tipoB" && campo.checked) {contB=contB+1}
}
}
formulario.uno.value = contA+' '+contB;
}
</script>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form name="formulario" method="post" action="">
<input type="checkbox" name="tipoA"
onClick="contar();">
<input type="checkbox" name="tipoA"
onClick="contar();">
<input type="checkbox" name="tipoA"
onClick="contar();">
<input type="checkbox" name="tipoB"
onClick="contar();">
<input type="checkbox" name="tipoB"
onClick="contar();">
<input type="checkbox" name="tipoB"
onClick="contar();">
<br>
<input type="text" name="dia" size="10">
<br>
<input type="text" name="uno" size="10">
<br>
</form>
</body>
</html>
Como siempre, si hay algo que no entiendas dímelo.
Ya lo he solucionado los 2 problemas. El primero era como ponías, y el segundo era algo más sencillo: simplemente llamando a la función contar2, por ejemplo, ya va
Respuesta
-1
a ver si te vale este script, http://www.mredkj.com/javascript/numberFormat.html , saludos. Nacho Ruiz.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas