Tengo un formulario donde el usuario puede agregar altura en pies y pulgadas (no puede ser mayor a 12) donde también puede estar en forma decimal. Los valores se toman en pies y pulgadas y luego se combinan para enviarlos al backend. Desde el backend, solo se envía ese valor de altura, por lo que necesito decodificarlo en pies y pulgadas. Hasta ahora se ha hecho de esta manera;
enviar caso
const newHeight = +this.heightFt + +this.heightIn / 12;mientras se renderiza en el campo de entrada
heightFt: +getDecodedFeet(this.group.height), // this is the value that was generated while submitting(+this.heightFt + +this.heightIn/12) heightIn: +getDecodedInch(this.group.height),Así es como estoy tratando de decodificar pies y pulgadas solo del valor de altura. Sin embargo, la forma en que lo estoy haciendo no funciona correctamente. Por propiamente, quiero decir que si proporciono un valor como 4.5 para heightFt y 2 para inch entonces mientras decodifico obtengo 4.666666666666667 y 8 como inch pero si doy 5 como heightFt y 0 como heightIn puedo decodificarlo de la misma manera.
const getFeet = (value = 0) => { return value; }; const getInch = (value = 0) => { const inch = Math.round((value % 1) * 12); return inch; }; const getDecodedFeet = (value = 0) => { return getFeet(value) - getDecodedInch(value) / 12; }; const getDecodedInch = (value = 0) => { return parseInt(getInch(value) - value); };getHeight toma la altura en pulgadas y se la devuelve en pulgadas o en pies y pulgadas. setHeight toma valores en pies o pies y pulgadas y se los devuelve en pulgadas.
Puede parecer redundante tener una función que tome valores en pulgadas y los devuelva igual, pero creo que internalizar una lógica como esta dentro de la función elimina la basura adicional en el código y ayuda a estandarizar el formato con el que trabajar.
// value in inches and format 0 = return value in ft, in and 1 = return value in just inches // return value is in an array of length 2 in the format [x(feet), y(inches)] const getHeight = (value, format = 0) => { if (format === 0) { //in feet and inches const heightInFeet = Math.floor(value/12); const remainderInInches = value%12; return [heightInFeet, remainderInInches]; } if (format === 1) { //in inches return [0, value]; } } // accepts 2 parameters, feet (decimals are OK) and optional inches and calculates them into inches. const setHeight = (feet, inches) => { let value = inches ? inches : 0; value += feet*12; return value; } console.log(getHeight(setHeight(5,4))); console.log(getHeight(setHeight(5,4), 1)); //in decimals console.log(getHeight(setHeight(5.5,6))); console.log(getHeight(setHeight(5.5))); console.log(getHeight(setHeight(5.5,0.5))); console.log(getHeight(setHeight(5.542,5.5))); console.log(setHeight(5.5)); console.log(setHeight(5.5,0.5));