0

I have written a program that is supposed to translate correctly from numbers to words. But the problem is whenever I write something between 111 and 119 then showing One Hundred undefined One i want it currect way. also whenever I write 1001 then showing One Thousand Hundred One and when I write something between 1011 and 1019 then showing One Thousand Hundred undefined One

I have given my code below

index.html

<!DOCTYPE html>
<html lang="en">
  <link rel="stylesheet" href="style.css">

  <body>
    <main>
      <form id="form">
        <label for="cft">Enter Number</label>
        <input type="number" id="num" name="num" />
        <input type="text" id="text" name="text" />
      </form>
    </main>

    <script src="script.js"></script>
  </body>
</html>

script.js

const form = document.getElementById("form");
const num = document.getElementById("num");
const text = document.getElementById("text");

const ones = {
  0: "",
  1: "One",
  2: "Two",
  3: "Three",
  4: "Four",
  5: "Five",
  6: "Six",
  7: "Seven",
  8: "Eight",
  9: "Nine",
  10: "Ten",
  11: "Eleven",
  12: "Twelve",
  13: "Thirteen",
  14: "Fourteen",
  15: "Fifteen",
  16: "Sixteen",
  17: "Seventeen",
  18: "Eighteen",
  19: "Nineteen",
};

const prefixes = {
  2: "Twenty",
  3: "Thirty",
  4: "Forty",
  5: "Fifty",
  6: "Sixty",
  7: "Seventy",
  8: "Eighty",
  9: "Ninety",
};

num.addEventListener("input", function () {
  const number = +num.value;
  let words = "";

  if (number >= 0 && number <= 19) {
    words = ones[number];
  } else if (number >= 20 && number <= 99) {
    const tens = Math.floor(number / 10);
    const onesPlace = number % 10;
    words = prefixes[tens] + " " + ones[onesPlace];
  } else if (number >= 100 && number <= 999) {
    const hundreds = Math.floor(number / 100);
    const tens = Math.floor((number % 100) / 10);
    const onesPlace = number % 10;

    if (tens === 0 && onesPlace === 0) {
      words = ones[hundreds] + " Hundred";
    } else if (tens === 0) {
      words = ones[hundreds] + " Hundred " + ones[onesPlace];
    } else if (onesPlace === 0) {
      words = ones[hundreds] + " Hundred " + prefixes[tens];
    } else {
      words =
        ones[hundreds] +
        " Hundred " +
        prefixes[tens] +
        " " +
        ones[onesPlace];
    }
  } else if (number >= 1000 && number <= 9999) {
    const thousands = Math.floor(number / 1000);
    const hundreds = Math.floor((number % 1000) / 100);
    const tens = Math.floor((number % 100) / 10);
    const onesPlace = number % 10;

    if (tens === 0 && onesPlace === 0) {
      words = ones[thousands] + " Thousand " + ones[hundreds] + " Hundred";
    } else if (tens === 0) {
      words =
        ones[thousands] +
        " Thousand " +
        ones[hundreds] +
        " Hundred " +
        ones[onesPlace];
    } else if (onesPlace === 0) {
      words =
        ones[thousands] +
        " Thousand " +
        ones[hundreds] +
        " Hundred " +
        prefixes[tens];
    } else {
      words =
        ones[thousands] +
        " Thousand " +
        ones[hundreds] +
        " Hundred " +
        prefixes[tens] +
        " " +
        ones[onesPlace];
    }
  } else {
    words = "Number out of range.";
  }

  text.value = words;
});

But the problem is whenever I write something between 111 and 119 then showing One Hundred undefined One i want it currect way. also whenever I write 1001 then showing One Thousand Hundred One and when I write something between 1011 and 1019 then showing One Thousand Hundred undefined One

I want if write between 111 to 129 to show One Hundred Eleven whenever I write 1001 then show One Thousand One and when I write something between 1011 and 1019 then show One Thousand Eleven

1 Answers1

0

Never mind the bug, you have too many repetitions in your code. I tried to lighten it up a little. This should be good enough for <10000 range.

const form = document.getElementById("form");
const num = document.getElementById("num");
const text = document.getElementById("text");

const ones = {
  0: "Zero",
  1: "One",
  2: "Two",
  3: "Three",
  4: "Four",
  5: "Five",
  6: "Six",
  7: "Seven",
  8: "Eight",
  9: "Nine",
  10: "Ten",
  11: "Eleven",
  12: "Twelve",
  13: "Thirteen",
  14: "Fourteen",
  15: "Fifteen",
  16: "Sixteen",
  17: "Seventeen",
  18: "Eighteen",
  19: "Nineteen",
};

const prefixes = {
  1: "Ten",
  2: "Twenty",
  3: "Thirty",
  4: "Forty",
  5: "Fifty",
  6: "Sixty",
  7: "Seventy",
  8: "Eighty",
  9: "Ninety",
};

function do_0_99(number) {
  var words = ""
  if (number >= 0 && number <= 19) {
    words = ones[number];
  } else if (number >= 20 && number <= 99) {
    const tens = Math.floor(number / 10);
    const onesPlace = number % 10;
    words = prefixes[tens] + (onesPlace ? " " + ones[onesPlace] : "");
  }
  return words;
}


num.addEventListener("input", function() {
  const number = +num.value;
  let words = "";

  if (number >= 0 && number <= 99) {
    words = do_0_99(number);
  } else if (number <= 9999) {
    const thousands = Math.floor(number / 1000);
    var rest = number - thousands * 1000;
    const hundreds = Math.floor(rest / 100);
    rest = rest - hundreds * 100;

    words = "" +
      (thousands ? ones[thousands] + " Thousand " : "") +
      (hundreds ? ones[hundreds] + " Hundred " : "") +
      (rest ? do_0_99(rest) : "")

  } else {
    words = "Number out of range.";
  }

  text.value = words;
});
<form id="form">
  <label for="cft">Enter Number</label>
  <input type="number" id="num" name="num" />
  <input type="text" id="text" name="text" style="width:100%" />
</form>
IT goldman
  • 14,885
  • 2
  • 14
  • 28