HTML input type="number" still returning a string when accessed from javascript

59,299

Solution 1

Neither HTML nor HTTP really have the concept of data types (possibly because they aren't programming languages to begin with) and everything is a string. When you use another language to reach that information you may sometimes get some amount of magic as a feature (for instance, PHP will generate arrays from GET/POST fields that have paired square brackets on their names) but that's a feature of such other language.

In this case, .value belongs to the DOM API and such API does have types. But let's see how it's defined. The <input> tag is represented by the HTMLInputElement interface and the value property is of type DOMString:

DOMString is a UTF-16 String. As JavaScript already uses such strings, DOMString is mapped directly to a String.

In other words, type="number" is a hint to implement client-side validation and appropriate GUI controls but the underlying element will still store strings.

Numeric keyboard screen-shot

Solution 2

You can use valueAsNumber (described on that page) to get the actual number value. So your code would then be:

function addNum(n1, n2) {
  return n1 + n2;
}

function addNumAction() {
  var n1 = document.getElementById("num1").valueAsNumber;
  var n2 = document.getElementById("num2").valueAsNumber;

  var sum = addNum(n1, n2);
  window.alert("" + sum);

}

Solution 3

  1. HTML Input elements are documented to return string representing a number. See the documentation here : Documentation of HTML Input

  2. When you set input type="number" then these input field don't accept non numeric input but at the same time it doesn't make the input value type "number". The reason is inputted number contain digits as a subset of the valid characters, but they also contain completely non-numeric characters like spaces, hyphens and parenthesis.

Solution 4

Use valueAsNumber

Non-numbers can still be input. Make sure to check for validity, and handle mistakes.

const value = myInput.valueAsNumber
if (isNaN(value)) return // or other handling

If you require updates on every change:

myInput.addEventListener("change", () => {
    const newValue = myInput.valueAsNumber
    if (isNan(newValue)) return

    // Handle change
})
Share:
59,299
Sainath S.R
Author by

Sainath S.R

Love software.Here to get help and give back to the community :) . Currently working as a software developer.

Updated on October 21, 2021

Comments

  • Sainath S.R
    Sainath S.R over 2 years

    I'm new to javascript , I'm trying learning how functions etc in JS and trying to add 2 numbers

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <title>JS ADD</title>
    </head>
    
    <body>
    
      <h1>Funcitons is JS</h1>
    
    
      <input type="number" id="num1">
      <input type="number" id="num2">
    
      <button type="button" onclick="addNumAction()">
        Add
      </button>
    
      <script>
        function addNum(n1, n2) {
          return parseInt(n1) + parseInt(n2);
        }
    
        function addNumAction() {
          var n1 = document.getElementById("num1").value;
          var n2 = document.getElementById("num2").value;
    
          var sum = addNum(n1, n2);
          window.alert("" + sum);
    
        }
      </script>
    
    </body>
    
    </html>

    If I remove the parseInt() the value is treated as a string only , then what is the point of using <input type="number"> ?please explain to me. what field to use for getting input as a number?

  • User
    User about 3 years
    Link is broken.