He colocado este código en GTM para capturar valores de la matriz de productos y actualmente se enfrentan dos problemas:
var aa_ck_items = []; try{ var aa_ck_products = analytics_dataLayer.ecommerce.purchase.products || []; aa_ck_products.forEach(function(element) { var currentItem = { "unitPrice": Number(element.price) / Number(element.quantity) + Number(element.discount), "itemId": element.id, "quantity": Number(element.quantity), "discount": Number(element.discount), } aa_ck_items.push(currentItem); }); }catch(e){}Problemas enfrentados
Cuando se envía el valor de unitPrice , tiene muchos números después del decimal, por ejemplo , 12.23000002 y estoy buscando redondearlo a dos decimales. Conozco los dos métodos que podemos usar Math.round() y .toFixed(). No estoy seguro de cómo implementarlo en el código anterior.
El valor del descuento a veces viene como un número negativo y siempre debe ser positivo. ¿Cómo puedo hacer eso?
¿Puede ayudarme alguien, por favor? ¡Gracias!
Envuélvelo todo y usa .toFixed(2) como sugeriste~
¿Quieres convertir los números negativos en positivos o los números negativos en 0?
Dado tu código...
aa_ck_products.forEach(function(element) { var currentItem = { "unitPrice": (Number(element.price) / Number(element.quantity) + Number(element.discount)).toFixed(2), "itemId": element.id, "quantity": Number(element.quantity), "discount": Math.abs(Number(element.discount)), // OR "discount": (Number(element.discount) > 0) ? Number(element.discount) : 0, } aa_ck_items.push(currentItem); });Para 1. No estoy seguro de cómo implementarlo en el código anterior <--- simplemente encierre el cálculo dentro de ( & ) y agregue el sufijo .toFixed(2) (si necesita corregir 2 dígitos después del decimal, por ejemplo).
Para 2. ¿Cómo hago eso? <--- Matemáticas.abs()
Los dos elementos anteriores se muestran (con comentarios) en el siguiente ejemplo de código.
let aa_ck_items = []; try { const aa_ck_products = analytics_dataLayer.ecommerce.purchase.products || []; aa_ck_products.forEach(function(element) { const currentItem = { "unitPrice": ( Number(element.price) / Number(element.quantity) + Number(element.discount) ).toFixed(2), // <<--- #1 from question, assuming 2 digits after decimal for .toFixed() "itemId": element.id, "quantity": Number(element.quantity), "discount": Math.abs( // <<--- #2 from question, using Math.abs() Number(element.discount) ) } aa_ck_items.push(currentItem); }); } catch (e) {} NOTA : el uso de var se ha modificado para let o const según corresponda.
A continuación se muestra cómo probablemente escribiría este código:
let aa_ck_items = []; try { const aa_ck_products = analytics_dataLayer.ecommerce.purchase.products || []; aa_ck_items = aa_ck_products.map( ({price, quantity, discount, id}) => ({ "unitPrice": ( Number(price) / Number(quantity) + Number(discount) ).toFixed(2), "itemId": id, "quantity": Number(quantity), "discount": Math.abs(Number(discount)) }) ); } catch (e) {}Gracias James por la sugerencia en los comentarios.
//to approximate a decimal number using fixed-point notation let number = 123.456; number.toFixed(2); //expected as: 123.45 //to get the module (positive side) of a number let negative_number = -10; Math.abs(negative_number); //expected as: 10