Trong Bản in, Cách kiểm tra xem một chuỗi có phải là Số không


184

Trong Bản in, phần này hiển thị lỗi cho biết isNaN chỉ chấp nhận các giá trị số

isNaN('9BX46B6A')

và điều này trả về sai vì parseFloat('9BX46B6A')đánh giá9

isNaN(parseFloat('9BX46B6A'))

Tôi vẫn có thể chạy với lỗi hiển thị trong Visual Studio, nhưng tôi muốn làm điều đó đúng cách.

Hiện tại, tôi đã viết chức năng sửa đổi này -

static isNaNModified = (inputStr: string) => {
    var numericRepr = parseFloat(inputStr);
    return isNaN(numericRepr) || numericRepr.toString().length != inputStr.length;
}

Câu trả lời:


338

Cách để chuyển đổi một chuỗi thành một số là Numberkhông parseFloat.

Number('1234') // 1234
Number('9BX9') // NaN

Bạn cũng có thể sử dụng toán tử cộng đơn nếu bạn thích tốc ký:

+'1234' // 1234
+'9BX9' // NaN

Cẩn thận khi kiểm tra đối với NaN (nhà điều hành ===!==không hoạt động như mong đợi NaN). Sử dụng:

 isNaN(maybeNumber) // returns true if NaN, otherwise false

18
điều đó có nghĩa là làm điều này: if (isNaN (+ ossibleNumberString)) là một cách kiểm tra hợp lệ?
Mathijs

5
Tại sao bạn sẽ sử dụng Numberở trên parseInthoặc parseFloat? Number('')cho 0 trong khi parseInt('')đưa ra NaNphù hợp hơn với những gì tôi mong đợi.
Didii

6
Như đã đề cập trong câu hỏi ban đầu , parseInt('9BX9')(và parseFloat('9BX9')) sẽ trở lại 9, không NaN. Nếu bạn không muốn chuyển đổi chuỗi rỗng thành 0, trước tiên hãy kiểm tra rõ ràng chuỗi trống.
C Snover

1
Nếu bạn muốn kiểm tra nó, sử dụng isNaN(Number(what_ever))thay vì Number(what_ever) === Nan.
k0pernikus

3
@sauntimo Numberkhông phải là một thứ TypeScript, nó là hàm xây dựng EcmaScript tích hợp , chấp nhận một giá trị và trả về một số nguyên thủy khi được gọi là hàm chứ không phải là hàm tạo.
C Snover

46

Cập nhật 2

Phương pháp này không còn có sẵn trong rxjs v6

Tôi đang giải quyết nó bằng cách sử dụng các IsNumeric điều hành từ rxjs thư viện (nhập khẩu rxjs / util / IsNumeric

Cập nhật

import { isNumeric } from 'rxjs/util/isNumeric';

. . .

var val = "5700";
if (isNumeric(val)){
   alert("it is number !");
}

5
Phương pháp này không còn có sẵn trong rxjs v6.
Logic01

35
function isNumber(value: string | number): boolean
{
   return ((value != null) &&
           (value !== '') &&
           !isNaN(Number(value.toString())));
}


3

Tôi sẽ chọn một giải pháp hiện có và đã được thử nghiệm. Ví dụ: điều này từ rxjs trong bản thảo:

function isNumeric(val: any): val is number | string {
  // parseFloat NaNs numeric-cast false positives (null|true|false|"")
  // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
  // subtraction forces infinities to NaN
  // adding 1 corrects loss of precision from parseFloat (#15100)
  return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
}

rxjs / isNumeric.ts

Không có hàm rxjs isArray () và với các kiểu chữ đơn giản:

function isNumeric(val: any): boolean {
  return !(val instanceof Array) && (val - parseFloat(val) + 1) >= 0;
}

Bạn nên luôn luôn kiểm tra các chức năng như vậy với các trường hợp sử dụng của bạn. Nếu bạn có các loại giá trị đặc biệt, chức năng này có thể không phải là giải pháp của bạn. Bạn có thể kiểm tra chức năng ở đây.

Kết quả là:

enum         : CardTypes.Debit   : true
decimal      : 10                : true
hexaDecimal  : 0xf10b            : true
binary       : 0b110100          : true
octal        : 0o410             : true
stringNumber : '10'              : true

string       : 'Hello'           : false
undefined    : undefined         : false
null         : null              : false
function     : () => {}          : false
array        : [80, 85, 75]      : false
turple       : ['Kunal', 2018]   : false
object       : {}                : false

Như bạn có thể thấy, bạn phải cẩn thận, nếu bạn sử dụng chức năng này với enums.


1

Hầu hết thời gian giá trị mà chúng tôi muốn kiểm tra là chuỗi hoặc số, vì vậy đây là hàm mà tôi sử dụng:

const isNumber = (n: string | number): boolean => 
    !isNaN(parseFloat(String(n))) && isFinite(Number(n));

Kiểm tra Codeandbox .

const willBeTrue = [0.1, '1', '-1', 1, -1, 0, -0, '0', "-0", 2e2, 1e23, 1.1, -0.1, '0.1', '2e2', '1e23', '-0.1', ' 898', '080']

const willBeFalse = ['9BX46B6A', "+''", '', '-0,1', [], '123a', 'a', 'NaN', 1e10000, undefined, null, NaN, Infinity, () => {}]

1

Bạn có thể sử dụng Number.isFinite()chức năng:

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false
Number.isFinite('0');       // false
Number.isFinite(null);      // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

Lưu ý: có sự khác biệt đáng kể giữa chức năng toàn cầu isFinite()và chức năng sau Number.isFinite(). Trong trường hợp trước đây, việc ép buộc chuỗi được thực hiện - vì vậy isFinite('0') === truetrong khi đó Number.isFinite('0') === false.

Ngoài ra, lưu ý rằng điều này không có sẵn trong IE!


Nhưng ... TS2345: Đối số của loại '"1"' không thể gán cho tham số của loại 'số'. Nó cần phải là Number.isFinite (Số ('0'));
Mcgri

0

Đối với số đầy đủ (không nổi) trong Angular bạn có thể sử dụng:

if (Number.isInteger(yourVariable)) { ... }


1
Number.isIntegerchỉ cho bạn biết nếu yourVariable, đã là một numberloại, là một số nguyên. Không hoạt động với chuỗi. Vì vậy, Number.isInteger(Number(yourVariable))có thể làm các mẹo.
kể chuyện

-2

Cho dù một chuỗi có thể được phân tích cú pháp như một số là một mối quan tâm thời gian chạy. Bản đánh máy không hỗ trợ trường hợp sử dụng này vì nó tập trung vào an toàn thời gian biên dịch (không phải thời gian chạy).


11
Nó đủ quan tâm để đánh dấu nó là một lỗi, như thể đề nghị nó không đúng.
Jane Panda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.