Как узнать, является ли строка javascript числом ИЛИ датой?

У меня есть значение, которое может быть строковой датой или числом. Я хотел бы обрабатывать каждый случай по-разному.

Значения даты могут быть любой допустимой строкой даты, которая может быть проанализирована библиотекой дат, например dayjs. Например: "10/10/2020", "10-20-2020"...

Числовые значения могут быть фактическими числами или числами в виде строки, поэтому такие значения, как 5, "5.3", "10"...

Например ->


      const number = parseFloat(value);
      if (!isNaN(number)) {
          return NumberValueConverter.prototype.toView(number);
      }

      const date = dayjs(value);
      if (date.isValid()) {
          return DateValueConverter.prototype.toView(value);
      }

Однако этот код не работает - поскольку строки даты, такие как 10-10-2020, 10-10-2020, в конечном итоге анализируются до 10

Если я сделаю это в обратном порядке, dayjs преобразует числа, такие как 10, в действительную дату.


person twoLeftFeet    schedule 18.03.2021    source источник
comment
Не используйте parseFloat вообще, только isNaN(value). Он вернет независимо от того, дает ли преобразование действительное число или нет. isNaN("10-10-2020") это true   -  person VLAZ    schedule 18.03.2021
comment
Это не обязательно возможно, учитывая все форматы даты. Например, 20210318 является допустимым представлением даты в базовом формате ISO 8601. Это также действующий номер. (2021-03-18 — это расширенный формат даты ISO 8601.)   -  person Matt Johnson-Pint    schedule 18.03.2021
comment
@MattJohnson-Пинта, это честно. Я не ожидаю 100% успеха с этим - это значения пользовательского ввода, которые сохраняются в JSON - я в основном ищу метод с наилучшими усилиями, который вернет довольно полезный результат для отображения большую часть времени на конечный пользователь.   -  person twoLeftFeet    schedule 18.03.2021


Ответы (3)


parseFloat уже счастлив, когда данная строка начинается с цифры, поэтому, если вы затем проверите isNaN на этом результате, вы получите ложные срабатывания.

Поэтому не проверяйте, является ли результат числовым, а проверяйте, представляет ли число исходная строка:

if (!isNaN(number)) {

to:

if (!isNaN(value)) {

В качестве альтернативы вы можете использовать унарный плюс вместо parseFloat, который будет возвращать определенное число только тогда, когда ввод представляет число:

const number = +value;

... и тогда лучше всего протестировать с Number.isNaN:

if (!Number.isNaN(number)) {
person trincot    schedule 18.03.2021

if(/^[0-9]+[.]{0,1}[0-9]*$/.test(value)) {
     // Handle your number value
} else {
     // Check for date here
}

Вы можете использовать приведенное выше регулярное выражение для разбора числовой строки.

  • /^ : Относится к началу вашей строки
  • $/ : относится к концу вашей строки
  • [0-9]+ : Начало строки от 0 до 9 с минимальной длиной
  • [.]{0,1} : может содержать 0 или максимум 1 '.'
  • [0-9]* : Может содержать от 0 до 9 цифр в конце строки.
person Mayank Vamja    schedule 18.03.2021

Вы можете использовать регулярное выражение, чтобы проверить, выглядит ли строка как дата перед отображением. Это регулярное выражение взято из https://www.regextester.com/96683. Оно проверяет, выглядит ли оно как дата, в которую вы вошли.

Существует более сложное регулярное выражение, которое проверяет разные форматы даты, если вы заранее не знаете формат: https://stackoverflow.com/a/15504877/14948219

 if(([12]\d{3}/(0[1-9]|1[0-2])/(0[1-9]|[12]\d|3[01])).test(value)){
    return date
 } else if(isNan(value){
    return number
    
 }
person Callum    schedule 18.03.2021