Check if a variable contains a numerical value in Javascript?

后端 未结 9 1437
伪装坚强ぢ
伪装坚强ぢ 2020-12-01 18:36

In PHP, it\'s pretty easy:

is_numeric(23);//true
is_numeric(\"23\");//true
is_numeric(23.5);//true
is_numeric(true);//false

But how do I do

相关标签:
9条回答
  • 2020-12-01 19:11

    Here's some benchmarks for isNaN vs. isFinite and typeof === "number"

    http://jsperf.com/isnan-vs-isfinite-vs/3

    Apparently typeof === "number" is roughly 5 times faster

    0 讨论(0)
  • 2020-12-01 19:13
    function is_numeric(val) {
      return ((+val) == val);
    }
    

    That should do the trick.

    0 讨论(0)
  • 2020-12-01 19:15

    Here's what I came up with:

    value = "2.34";
    if (parseFloat(value).toString() === value) {
        alert("number");
    }
    

    This should work with floats and ints, positive and negative. I don't know about infinity, as some of the answers above have discussed.

    If your value might actually be a number and not always a string, you can change the === to a == and it will handle both.

    0 讨论(0)
  • 2020-12-01 19:16

    Here is my Solution : ES6/2015

    Disclaimer: This solution works only if user send a Number Type as an input. For Example: 23 is a number type but '23' is not a number type it is a String Type.

    function isValidNumber(value) {
      return typeof value === 'number' && Number.isNaN(value) === false;
    }
    

    Test Cases

    isValidNumber(10) // true
    isValidNumber(10.34) // true
    isValidNumber('geo10') // false
    isValidNumber('10geo') // false
    isValidNumber('') // false
    isValidNumber(NaN) // false
    isValidNumber(true) // false
    isValidNumber(false) // false
    
    0 讨论(0)
  • 2020-12-01 19:22

    Run the code snippet to see comparisons of top answers on this topic.

    Some test cases are not highlighted (and don't contribute to the summary). These cases are flagged as ambiguous because it is not clear whether a given value should or should not be considered a number.

    // Each of these functions should output a truthy/falsy value if the input is
    // a number
    const solutionsToTest = [
      v => parseFloat(v),
      v => Number(v),
      v => !isNaN(v),
      v => typeof v != "boolean" && !isNaN(v),
      v => isFinite(String(v)),
      v => !isNaN(parseFloat(v)) && isFinite(v)
    ];
    
    const testCases = [
      //[ Test Name, Test Value, Expected Output, Is Ambiguous ]
    
      // Whitespace
      ['""', "", false, false],
      ['"\\t"', "\t", false, false],
      ['" "', " ", false, false],
    
      // Infinity
      ['"Infinity"', "Infinity", false, true],
      ['"+Infinity"', "Infinity", false, true],
      ["-Infinity", -Infinity, false, true],
      ["Infinity", Infinity, false, true],
    
      // Numbers mixed with symbols
      ['"123abc"', "123abc", false, true],
      ['"abc123"', "abc123", false, false],
      ['".0."', ".0.", false, false],
      ['"1."', "1.", true, true],
      ['"."', ".", false, true],
      ['"01"', "01", true, true],
      ['"-0"', "-0", true, true],
      ["+1", +1, true, true],
      ["-1", -1, true, true],
    
      // Other js types
      ["'null'", "null", false, false],
      ["'true'", "true", false, false],
      ["'false'", "false", false, false],
      ["null", null, false, false],
      ["true", true, false, false],
      ["false", false, false, false],
      ["NaN", NaN, false, false],
      ["[]", [], false, false],
      ["{}", {}, false, false],
      ["/./", /./, false, false],
      ["() => {}", () => {}, false, false]
    ];
    
    const styles = {
      code: {
        fontFamily: "monospace",
        fontSize: 16
      },
      success: {
        backgroundColor: "#00ff5478"
      },
      failure: {
        backgroundColor: "#ff00008c"
      }
    };
    
    class TestCaseTable extends React.Component {
      static renderTableHeader(solutionsToTest) {
        return (
          <tr>
            <th>
              <p>Test Case</p>
            </th>
            {solutionsToTest.map(f => (
              <th key={f.toString()}>
                <p style={styles.code}>{f.toString()}</p>
              </th>
            ))}
          </tr>
        );
      }
      static renderTableRow(testCase, solutionsToTest) {
        const [testName, input, expectedOutput, isAmbiguous] = testCase;
        return (
          <tr key={testName}>
            <td style={styles.code}>{testName}</td>
            {solutionsToTest.map(f => {
              const output = Boolean(f(input));
              const style = isAmbiguous
                ? {}
                : output == expectedOutput ? styles.success : styles.failure;
              return (
                <td style={style} key={f.toString()}>
                  <p>{output + ""}</p>
                </td>
              );
            })}
          </tr>
        );
      }
      render() {
        // Sort test cases, put the ambiguous ones after (but maintain stable sort
        // order)
        let sortedCases = [
          ...testCases.filter(([a, b, c, ambiguous]) => !ambiguous),
          ...testCases.filter(([a, b, c, ambiguous]) => ambiguous)
        ];
        return (
          <table>
            <thead>{TestCaseTable.renderTableHeader(solutionsToTest)}</thead>
            <tbody>
              {sortedCases.map(tc =>
                TestCaseTable.renderTableRow(tc, solutionsToTest)
              )}
            </tbody>
          </table>
        );
      }
    }
    class TestCaseSummaryTable extends React.Component {
      renderTableHeader(solutionsToTest) {
        return (
          <tr>
            <th>Summary</th>
            {solutionsToTest.map(f => (
              <th key={f.toString()}>
                <p style={styles.code}>{f.toString()}</p>
              </th>
            ))}
          </tr>
        );
      }
      renderSuccessRateRow(solutionsToTest, testCases) {
        // Ignore potentially ambiguous test cases
        testCases = testCases.filter(
          ([name, input, expected, ambiguous]) => !ambiguous
        );
    
        const numSuccess = testSolution =>
          testCases.reduce((succeeded, [name, input, expected]) => {
            return succeeded + (Boolean(testSolution(input)) == expected ? 1 : 0);
          }, 0);
    
        return (
          <tr>
            <td>
              <p>Test Success</p>
            </td>
            {solutionsToTest.map(f => (
              <td>
                <p>
                  {numSuccess(f)} / {testCases.length}
                </p>
              </td>
            ))}
          </tr>
        );
      }
      render() {
        return (
          <table>
            <thead>{this.renderTableHeader(solutionsToTest)}</thead>
            <tbody>{this.renderSuccessRateRow(solutionsToTest, testCases)}</tbody>
          </table>
        );
      }
    }
    
    const root = () => {
      return (
        <div>
          <TestCaseSummaryTable />
          <TestCaseTable />
        </div>
      );
    };
    
    ReactDOM.render(root(), document.querySelector("#application"));
    td {
      text-align: center;
      vertical-align: middle;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="application"></div>

    0 讨论(0)
  • 2020-12-01 19:24

    What about:

    function isNumber(n){
        return typeof(n) != "boolean" && !isNaN(n);
    }
    

    The isNaN built-in function is used to check if a value is not a number.

    Update: Christoph is right, in JavaScript Boolean types are convertible to Number, returning the 1 for true and 0 for false, so if you evaluate 1 + true the result will be 2.

    Considering this behavior I've updated the function to prevent converting boolean values to its numeric representation.

    0 讨论(0)
提交回复
热议问题