Skip to content
Advertisement

Can JSON strings be converted to fractions for equations when building REST API in Node JS?

I am creating an API for a picture framing calculator. I am using Node JS with Express. The code that I’m using is this:

        app.post("/api/calculator/singlematapi", (req,res) => {
        
        let FrameWidth = req.body.FrameWidth;
        let FrameWidthFraction = req.body.FrameWidthFraction
        let FrameHeight = req.body.FrameHeight;
        let FrameHeightFraction = req.body.FrameHeightFraction;
        let PictureWidth = req.body.PictureWidth;
        let PictureWidthFraction = req.body.PictureWidthFraction;
        let PictureHeight = req.body.PictureHeight;
        let PictureHeightFraction = req.body.PictureHeightFraction;
        let MatOverlap = req.body.MatOverlap;
        let MatOverlapFraction = req.body.MatOverlapFraction
        let width = (1/2)*((FrameHeight+FrameHeightFraction)-(PictureHeight+PictureHeightFraction)+(MatOverlap+MatOverlapFraction));
        let height = (1/2)*((FrameWidth+FrameWidthFraction)-(PictureWidth+PictureWidthFraction)+(MatOverlap+MatOverlapFraction));
        res.send(`Width Cut = ${new Fraction(width).toString()}", Height Cut = ${new Fraction(height).toString()}"`);
    });

Therefore, a JSON POST request would be:

{
    "FrameWidth": 16,
    "FrameWidthFraction": 0,
    "FrameHeight": 20,
    "FrameHeightFraction": 0,
    "PictureWidth": 11,
    "PictureWidthFraction": 0,
    "PictureHeight": 17,
    "PictureHeightFraction": 0,
    "MatOverlap": 0.5
}

What I am trying to accomplish is that instead of a decimal – a fraction such as 1/2 can be inputted instead. For example:

{
    "FrameWidth": 16,
    "FrameWidthFraction": 0,
    "FrameHeight": 20,
    "FrameHeightFraction": 0,
    "PictureWidth": 11,
    "PictureWidthFraction": 0,
    "PictureHeight": 17,
    "PictureHeightFraction": 0,
    "MatOverlap": 1/2
}

The problem I’m running into is that although I am able to convert the output from decimal to fraction using a library and this piece of code:

res.send(`Width Cut = ${new Fraction(width).toString()}", Height Cut = ${new Fraction(height).toString()}"`);

…I am not able to use a fraction as an input instead of a decimal.

Unless I’m misunderstanding – it states here: JSON data types – that Fractions pertaining to Numbers can only be displayed in decimal type formatting such as 0.5 like I have above under MatOverlap.

However, according to the same page it states that a forward slash can be used in a string.

Can I use the forward slash as the solidus to indicate a fraction when JSON data is inputted?

When I attempted to use a string by changing the above to:

{
   "MatOverlap": "1/2"
}

…then it throws NaN error.


EDIT 8/1/2022

This is for further clarification regarding one of the solutions to this question: this solution found below by some random nerd.

Particularly this comment:

You can enter just a 0 with this method as well

I wrote a piece of code to serve as an example of what I mean:

app.post("/add", (req, res)=>{
    let n1 = req.body.n1;
    let n2 = req.body.n2.split("/").reduce((a, b) => a / b);
    let sum = n1 + n2;
    res.send(`Sum = ${sum}`);
    
});

If I input:

{
   "n1": 1,
   "n2": "0/1"
}

The response is: Sum = 1

{
   "n1": 1,
   "n2": "0"
}

The response is: Sum = 10

See how 0 needs to be written as 0/1 in order for the math to work correctly? When the input is 0 I’m looking to write just a 0.

Advertisement

Answer

you can convert the fraction input to decimal.

let MatOverlap = req.body.MatOverlap.split("/").reduce((a, b) => a / b)

To also accept mixed fractions:

let MatOverlap =
  req.body.MatOverlap.split("/").reduce(
    (a, denom) =>
      a.split(" ").reduce((int, numer) => +numer + int * denom) / denom
  );

Advertisement