DEV Community

Luke
Luke

Posted on

A Simple, Reusable JS Function to Calculate Area from Dimensions

If you're building any kind of form that needs area calculations — a room sizing tool, a flooring estimator, a garden planner — you'll want one small, well-tested utility function rather than scattering length * width across your codebase. Here's a version built to handle real user input, not just clean numbers.

A Simple, Reusable JS Function to Calculate Area from Dimensions Featured image

Start with the naive version

function getArea(length, width) {
  return length * width;
}
Enter fullscreen mode Exit fullscreen mode

Works fine until someone passes a string from a form field, a negative number, or leaves a field blank. Then it silently returns NaN or a nonsensical negative area.

Add proper validation

function getArea(length, width) {
  const l = Number(length);
  const w = Number(width);

  if (Number.isNaN(l) || Number.isNaN(w)) {
    throw new TypeError("Length and width must be valid numbers");
  }

  if (l <= 0 || w <= 0) {
    throw new RangeError("Length and width must be greater than zero");
  }

  return l * w;
}
Enter fullscreen mode Exit fullscreen mode

This catches the two most common failure modes in a form: empty/non-numeric input and zero-or-negative values (which usually mean a field was left blank and defaulted to 0).

Handling unit conversion

Not every user measures in feet. A more useful version accepts a unit and normalizes internally:

const CONVERSION_TO_FEET = {
  feet: 1,
  inches: 1 / 12,
  meters: 3.28084,
  cm: 0.0328084
};

function getAreaInSqFt(length, width, unit = "feet") {
  const factor = CONVERSION_TO_FEET[unit];

  if (!factor) {
    throw new Error(`Unsupported unit: ${unit}`);
  }

  const l = Number(length) * factor;
  const w = Number(width) * factor;

  if (Number.isNaN(l) || Number.isNaN(w) || l <= 0 || w <= 0) {
    throw new RangeError("Invalid dimensions provided");
  }

  return l * w;
}

getAreaInSqFt(144, 120, "inches"); // 120
getAreaInSqFt(3.66, 3.05, "meters"); // ~11.16
Enter fullscreen mode Exit fullscreen mode

Writing tests for it

A function like this is small enough to fully test in a few lines, and worth doing since it's usually feeding a price or budget calculation downstream:

// Using a simple assert-based test, framework-agnostic
function testGetAreaInSqFt() {
  console.assert(getAreaInSqFt(12, 10) === 120, "Basic rectangle failed");
  console.assert(getAreaInSqFt(144, 120, "inches") === 120, "Inches conversion failed");

  try {
    getAreaInSqFt(-5, 10);
    console.assert(false, "Should have thrown on negative input");
  } catch (e) {
    console.assert(e instanceof RangeError, "Wrong error type on negative input");
  }

  try {
    getAreaInSqFt("abc", 10);
    console.assert(false, "Should have thrown on non-numeric input");
  } catch (e) {
    console.assert(e instanceof TypeError, "Wrong error type on non-numeric input");
  }

  console.log("All tests passed");
}

testGetAreaInSqFt();
Enter fullscreen mode Exit fullscreen mode

Wiring it to a form

document.querySelector("#calc-form").addEventListener("submit", (e) => {
  e.preventDefault();

  const length = document.querySelector("#length").value;
  const width = document.querySelector("#width").value;
  const unit = document.querySelector("#unit").value;

  try {
    const area = getAreaInSqFt(length, width, unit);
    document.querySelector("#result").textContent = `${area.toFixed(2)} sq ft`;
  } catch (err) {
    document.querySelector("#result").textContent = `Error: ${err.message}`;
  }
});
Enter fullscreen mode Exit fullscreen mode

That's the whole utility — validated, unit-aware, and tested. Drop it into any project needing area math without rebuilding the same edge-case handling every time.

If you want a reference for how this logic looks in a full production tool (multiple room sections, saved history, unit toggles all wired together), squarefootcalc.com is built on the same core function pattern — worth a look for the end-to-end implementation.

Top comments (1)

Collapse
 
topstar_ai profile image
Luis

I appreciate how the article progresses from a naive implementation of the getArea function to a more robust version, getAreaInSqFt, which handles unit conversions and input validation. The addition of a CONVERSION_TO_FEET object to normalize different units is particularly useful, as it makes the function more flexible and easier to maintain. The example of wiring this function to a form also demonstrates its practical application, and the tests provided ensure the function behaves as expected. One potential improvement could be to consider adding support for other area units, such as square meters or hectares, to make the function even more versatile.