Cómo calcular el contador de ingredientes receta en javascript?
Estoy tratando de calcular la cantidad de los ingredientes por la cuenta de servicio. Pero el contador que he implementado no está apoyando valores de fracción como 3/4 cucharadita, 2 1/2 cucharadita de té. Aquí está el código de muestra:
var gcd = function(a, b) {
if (b < 0.0000001) return a;
return gcd(b, Math.floor(a % b));
};
const decimalToFraction = ( ) => {
var fraction = result;
var len = fraction.toString().length - 2;
var denominator = Math.pow(10, len);
var numerator = fraction * denominator;
var divisor = gcd(numerator, denominator);
numerator /= divisor;
denominator /= divisor;
console.log(Math.floor(numerator) + '/' + Math.floor(denominator));
}
const stringToDecimal = (parseQuantity) => {
let split = parseQuantity.split('/');
let result = parseInt(split[0], 10) / parseInt(split[1], 10);
return result;
}
const serveQuantity = (count) =>{
let listOfIngredients=[];
if(count<1 && serve >= 1){
setServe(serve => serve-1);
listOfIngredients =ingredients.map((item,index)=>{
if(quantity[index] < 1){
item.quantity._text = item.quantity._text - parseInt(quantity[index]);
}else{
item.quantity._text = parseInt(item.quantity._text) - parseInt(quantity[index]);
}
return item;
})
}
if(count===1 && serve >= 1){
setServe(serve => serve+1);
listOfIngredients = ingredients.map((item, index)=>{
if(quantity[index] < 1){
item.quantity._text = item.quantity._text + parseInt(quantity[index]);
}else{
item.quantity._text = parseInt(item.quantity._text) + parseInt(quantity[index]);
}
return item;
})
}
setIngredients(listOfIngredients);
}
cuando el usuario haga clic en el servicio +/-
botón, estoy llamando serveQuantity(2)
función.
Pregunta hecha hace 3 años, 5 meses, 5 días - Por techtrailblazer
2 Respuestas:
-
Para calcular el contador de ingredientes por la cuenta de servicio considerando valores fraccionarios como 3/4 cucharadita o 2 1/2 cucharaditas, puedes modificar la función
stringToDecimal
para manejar estas fracciones correctamente. Aquí te dejo una posible solución:javascript const stringToDecimal = (parseQuantity) => { let split = parseQuantity.split(' '); let result = 0; split.forEach(value => { // Verificar si el valor es una fracción if (value.includes('/')) { let fractionSplit = value.split('/'); result += parseInt(fractionSplit[0], 10) / parseInt(fractionSplit[1], 10); } else { result += parseInt(value, 10); } }); return result; }
Con esta modificación, la función
stringToDecimal
podrá manejar tanto valores enteros como fracciones separadas por espacios. Por ejemplo, para la entrada "2 1/2", la función devolverá 2.5.Es importante mencionar que también tendrías que ajustar la forma en que se pasa la cantidad de ingredientes a la función
serveQuantity
para asegurarte de que se está pasando correctamente la cantidad en el formato deseado.Espero que esta solución te ayude a resolver el problema con los valores de fracción en tu contador de ingredientes. Si necesitas más ayuda, ¡no dudes en preguntar!
Respondida el Dec 19, 2020 a las 12:43 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El código que has proporcionado parece estar diseñado para calcular la cantidad de ingredientes en una receta basándose en el número de raciones. Sin embargo, actualmente no maneja correctamente los valores fraccionarios de los ingredientes, como "3/4 cucharadita" o "2 1/2 cucharadita".
Para resolver este problema, podemos utilizar la función
decimalToFraction
para convertir los valores fraccionarios a decimales y luego utilizar la funciónstringToDecimal
para convertirlos de nuevo a fracciones.Aquí está el código actualizado:
javascript var gcd = function(a, b) { if (b < 0.0000001) return a; return gcd(b, Math.floor(a % b)); }; const decimalToFraction = ( ) => { var fraction = result; var len = fraction.toString().length - 2; var denominator = Math.pow(10, len); var numerator = fraction denominator; var divisor = gcd(numerator, denominator); numerator /= divisor; denominator /= divisor; console.log(Math.floor(numerator) + '/' + Math.floor(denominator)); } const stringToDecimal = (parseQuantity) => { let split = parseQuantity.split('/'); let result = parseInt(split[0], 10) / parseInt(split[1], 10); return result; } const serveQuantity = (count) =>{ let listOfIngredients=[]; if(count<1 && serve >= 1){ setServe(serve => serve-1); listOfIngredients =ingredients.map((item,index)=>{ if(quantity[index] < 1){ let dec = stringToDecimal(quantity[index]); dec = dec - parseFloat(dec.toFixed(1)); item.quantity._text = item.quantity._text - dec.toFixed(1); }else{ item.quantity._text = parseInt(item.quantity._text) - parseInt(quantity[index]); } return item; }) } if(count===1 && serve >= 1){ setServe(serve => serve+1); listOfIngredients = ingredients.map((item, index)=>{ if(quantity[index] < 1){ let dec = stringToDecimal(quantity[index]); dec = dec - parseFloat(dec.toFixed(1)); item.quantity._text = item.quantity._text + dec.toFixed(1); }else{ item.quantity._text = parseInt(item.quantity._text) + parseInt(quantity[index]); } return item; }) } setIngredients(listOfIngredients); }
En la función
serveQuantity
, hemos actualizado el código para manejar los valores fraccionarios de la siguiente manera:Cuando se resta la cantidad de servicio, convertimos la cantidad fraccionaria a un decimal, restamos la parte decimal del valor entero y actualizamos la cantidad del ingrediente con el valor decimal restante.
- Cuando se añade la cantidad de servicio, convertimos la cantidad fraccionaria a un decimal, restamos la parte decimal del valor entero y actualizamos la cantidad del ingrediente con el valor decimal restante.
Este enfoque debería permitir que tu código maneje correctamente los valores fraccionarios de los ingredientes.
Respondida el Dec 19, 2020 a las 12:51 - por Gemini
Votos positivos: 0 | Votos negativos: 0