Pregunta

Ok, considerando que las expresiones regulares no funcionan correctamente y no hay errores, voy a intentar usar la máscara de dinero.

El objetivo sigue siendo permitir solo caracteres numéricos y un decimal. Con maskMoney, eso hace el trabajo por usted.

Además, necesito poder calcular con éxito cada celda.

En este momento, las máscaras funcionan bien, pero ya no puedo calcular. Aquí es donde estoy preocupado.

JQuery y código JavaScript:


<script type="text/javascript" language="javascript">
    $(document).ready(function(){
     $('.date').mask("99/99/9999");
     $('.account').mask("99-9-999999-9999");
     /*calcuating the vertical and horizontal inputs*/

     $('.R26').attr("disabled", "disabled");

 $('.calc').maskMoney({symbol: ""});
 $('.R25').unmaskMoney();
 $('.R18').unmaskMoney();

 $('input.description').focus(function(){
  if($(this).val()=="Enter text here"){
   $(this).val(" ");
  }

  else{
   $(this).val($(this).val());
  }
 });
 $('input.description').blur(function(){
  if($(this).val()==" "){
   $(this).val("Enter text here");
  }    
 });

$('.calc').keyup(function(){
 var classArray = $(this).attr('class').split(' ');
 //Personal gas expense
 $('.gasamount').sum("change", "#totals4");
 var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, "");
 $('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val());
 $('.gasmoney').sum("change", "#totals5");
 //////////////////////

 //Sum of each cell
 $.each(classArray, function(){
  $('.'+this).sum("change", ".ttl"+this);
 });
 //Finding the grandtotal
 var grandTotal = $('.row26').parent().children('td:last').children('input');
 var sum = $('.row25').parent().children('td').children('.calc').sum();
 grandTotal.val(Number(sum).toFixed(2));
});

ColdFusion y código HTML:

        #labels [r] #

<cfloop from="1" to="7" index="i">

 <td id="Day#i#" class="row#r# col#i#">
  <cfif r EQ 1>#Left(DayOfWeekAsString(i),3)#<cfelse><cfif r EQ 2>
  <input type="text" class="date-mask" /><cfelse>
  <input type="text" 
  <cfif labels[r] EQ "Personal Car: Mileage ##"> id="gasamount#i#" <cfelseif labels[r] EQ "Personal Car: Mileage <*>quot;>id="gasmoney#i#" </cfif><cfif labels[r] EQ "Daily Totals">id="dailytotals#i#"</cfif>
   class="<cfif labels[r] EQ "Personal Car: Mileage ##">gasamount<cfelse><cfif labels[r] NEQ "Daily Totals">C#i#</cfif></cfif>
   <cfif labels[r] EQ "Personal Car: Mileage <*>quot;>gasmoney<cfelse>calc R#r#</cfif>
   <cfif labels[r] EQ "Daily Totals">ttlC#i#</cfif>"
    <cfif labels[r] EQ "Daily Totals" OR labels[r] EQ "Personal Car: Mileage <*>quot;>readonly="readonly"</cfif>
     /></cfif>
     </cfif>
 </td>


</cfloop>

 <td class="totals"><cfif r EQ 1>Total<cfelse><input type="text" id="totals" class="ttlR#r#" readonly="readonly" /></cfif></td>

   

He tenido preguntas similares con la misma aplicación, pero en realidad no es un duplicado (en caso de que lo creas).

El '.' + este es un objeto creado por la matriz. Usé cfloops para crear una tabla grande y agregué varias clases. Tuve que dividir las clases múltiples en una matriz, y luego pude seleccionar cada clase como propia.

¿Fue útil?

Solución 4

Ok. Así que lo descubrí por mi cuenta.

Utilizando el maskMoney (), puedo controlar qué caracteres se ingresan y aún puedo calcular correctamente la tabla.

Todo lo que tuve que hacer para arreglar los cálculos fue desenmascarar el .gasamount:

                $('.gasamount').unmaskMoney();

Esto es lo que solucionó los problemas de cálculo. ^^ La máscara estaba causando problemas para el total de las 2 filas y esas 2 filas causaron que los cálculos se rompieran.


                $('.calc').maskMoney({symbol: ""});
                $('.R25').unmaskMoney();
                $('.R18').unmaskMoney();

            $('.calc').keyup(function(){
                var classArray = $(this).attr('class').split(' ');
                //Personal gas expense
                $('.gasamount').sum("change", "#totals4");
                var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, "");
                $('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val());
                $('.gasmoney').sum("change", "#totals5");
                //////////////////////

                //Sum of each cell
                $.each(classArray, function(){
                    $('.'+this).sum("change", ".ttl"+this);
                });
                //Finding the grandtotal
                var grandTotal = $('.row26').parent().children('td:last').children('input');
                var sum = $('.row25').parent().children('td').children('.calc').sum();
                grandTotal.val(Number(sum).toFixed(2));
            });

Todos los que intentaron ayudar, ¡gracias por tomarse el tiempo!

Si a alguien le gustaría usar este ejemplo o el código para futuras aplicaciones, siéntase libre de comentar y hágamelo saber y puedo configurar una página diferente con un ejemplo e instrucciones y la fuente.

Otros consejos

Es muy probable que quieras

.replace(/[A-Za-z$,-]/g, "")

en lugar de

.replace(/[A-Za-z$-,]/g, "")

La última expresión coincide:

  • todos los caracteres de " A " a " Z "
  • todos los caracteres de " a " a " z "
  • todos los caracteres de " $ " a " , " (existe tal rango, pero no estoy seguro si esa es su intención real)

La expresión anterior (tenga en cuenta el guión desplazado) coincide:

  • todos los caracteres de " A " a " Z "
  • todos los caracteres de " a " a " z "
  • el carácter " $ "
  • el carácter " , "
  • el carácter " - "

El guión tiene un significado especial en las clases de caracteres, define un rango. Si desea hacer coincidir un guión literal, muévalo al final (o al inicio) de la clase de caracteres.

EDITAR: aparte de eso, parece que quiere establecer el valor. La configuración a través de val () funciona pasando el nuevo valor a la función:

$dotThis = $('.' + this);
$dotThis.val($dotThis.val().replace(/[A-Za-z$-,]/g, ""));

Esta declaración:

$('.'+this).val().replace(/[A-Za-z$-,]/g, "");

crea una cadena reemplazada e inmediatamente la tira.

Puede ser un poco simplista, pero ¿por qué no usar la negación? Sintaxis de Perl: no estoy seguro acerca de JavaScript.

¿Por qué no? m / ([^ 0-9] +) // g

Partidos entre cero y nueve

EDITAR: Mi respuesta original fue parcialmente correcta, ya que cambió el valor, pero no solucionó un error más grave que ahora explicaré.

La razón por la que mi arreglo original hace que cada celda tenga el mismo valor es porque el método jQuery $ devuelve cada elemento que coincide con el selector dado. Sin embargo, llamar a val () solo le dará el valor del primer elemento coincidente, pero establecer el valor llamando a val (value) establecerá el valor de cada elemento coincidente.

La solución es hacer el reemplazo arriba de cada uno (), lo que solo desinfectará un solo elemento (el this ). Si también desea desinfectar las celdas de totales, entonces haría eso en cada uno () y usaría " .ttl " + this como selector en lugar de this .

$('.calc').keyup(function(){
    var classArray = $(this).attr('class').split(' ');

    //Sanitize out here, so we only affect one element.
    var singleCellVal = $(this).val()
    singleCellVal.replace(/[A-Za-z$-,]/g, "");
    $(this).val(singleCellVal);

    $.each(classArray, function(){
        var totalsum = $('.'+this).sum();
        $('.ttl'+this).val(Number(totalsum).toFixed(2));
    });

    //Finding the grandtotal
    var grandTotal = $('.row26').parent().
        children('td:last').children( 'input');
    var sum = $('.row25').parent().children( 'td').children('.calc').sum();
    grandTotal.val(Number(sum).toFixed(2));
});

Lo que quieres es

var value = $('.'+this).val();
value.replace(/[A-Za-z$-,]/g, "");
$('.' + this).val(value);

El $ en la clase de caracteres está bien, la mayoría de los metacaracteres en regex no son especiales dentro de las clases de caracteres. Sin embargo, el " $ -, " coincidirá con cualquier carácter que esté " entre " $ y , . Supongo que esto es lo que desea, pero si solo desea hacer coincidir $ y , y - , entonces debe cambiar esa parte a " < código> $, - " (es decir, / [A-Za-z $, -] / g ). Un - al final de una clase de caracteres coincidirá con el - , en cualquier otro lugar se ve como un rango a menos que se escape ( \ - ) .

Dólar ($) se usa para marcar el final de una búsqueda de expresiones regulares. / [A-Za-z $ -,] / puede no funcionar bien. Escapar del dólar con una barra invertida ( \ $ ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top