Напишите чистую функцию convertToNumber, если значение является числом

У меня есть функция, которая создает фильтры для некоторых данных. Фильтры добавляются в массив, а затем (позже) связываются через reduce функция (связующая часть не является частью моего вопроса).

Все данные, которые я получаю, представляют собой строки, но на самом деле могут быть числами, например {name:"-45.6"}. Если это может быть число, я хочу, чтобы значение было преобразовано в число.

formFilters = (builder) => {
    const filters = [];
    builder.forEach(b => {
        let {filtername, operator, value} = b;

        if(!value) return;

        if(isNumber(value)){
            value = Number(value);
        }

        switch (operator) {
            case "=":
                filters.push((item) => convertToNumber(item[filtername]) === value);
                break;
            case "<":
                filters.push((item) => convertToNumber(item[filtername]) < value);
                break;
            case ">":
                filters.push((item) => convertToNumber(item[filtername]) > value);
            
        }
    });
    return filters;
}

function convertToNumber(value){
    const number = Number(value);
    if (!Number.isNaN(number)) return number;
    return value;
}

Это работает, но мне интересно, есть ли более чистый способ преобразования значения в число, если это число?

1 ответ
1

Одна проблема с Number(value); это то, что бросает фальшивка ценности как 0 и правдивый ценности как 1.

Это означает, что пустая строка становится 0, что может быть не тем, что вы ожидаете.

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

let input = document.getElementById('input');
let result = document.getElementById('result');

function IsANumber() {
  let isItANumber = input.value.match(/^-?d*.?d+$/);
  result.innerHTML = isItANumber ? 'true' : 'false';
}
<input id="input" onchange="IsANumber()" onkeyup="IsANumber()" /><br/> Is a number: <span id="result"></span>

Приведенный выше пример не будет ошибочным в случаях правдивости / ложности, но он определит, что такие строки, как «Бесконечность», тоже не будут числами. Поэтому может потребоваться изменить его, если вам нужно преобразовать их в числовые значения.

  • Функция не работает для таких чисел, как "1e2", "0x10", "0b00" возвращает false.

    — Слепой67

Добавить комментарий

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