Встроенная функция или логика для проверки, является ли строка одним действительным числом

#matlab

#matlab

Вопрос:

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

Я использовал str2num с некоторой дополнительной проверкой, например isreal , при получении строки в окне редактирования. Пример показан ниже:

     total_units_buffer = str2num(get(handles_gui.edit_totalunits,'string')); 
    % Check if input is number and real
    if (~isempty(total_units_buffer) amp;amp; isreal(total_units_buffer))
        % Do stuff
    end
  

Обычно вывод происходит [] , когда ввод не является числом, поэтому я также использую isempty его в качестве теста. Однако недавно я обнаружил, что если i на входе есть, например 10i , он будет считывать число как мнимое число, а не возвращать [] . Я также недавно обнаружил, что если вы поместите пробел во ввод, например 10 10 , тогда str2num он будет считываться как два числа, что нарушает логику, которую я имею сейчас. Кроме того, NaN также будет считываться как число.

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

Итак, мне было интересно, есть ли собственная функция для проверки того, является ли строка одним вещественным числом в Matlab? Или, наоборот, существует ли гарантированная логика, которая абсолютно гарантирует, что число будет единственным действительным числом?

Ответ №1:

Должно быть достаточно следующего

 str =  %// your String 

x = str2double(str)
y = isfinite(x) amp;amp; isreal(x)
  

вы также могли бы рассмотреть что-то вроде этого:

 y = ~all(x-real(x))
  

Я только что видел, что оба метода не работают для ввода, подобного str = '5,0' . Это было бы 50, что, безусловно, нежелательно. Вы могли бы избежать этого, добавив строку:

 str = strrep(str,',','.')
  

Комментарии:

1. Хорошо, так isfinite лучше, чем isnan в моем случае, потому что оно охватывает оба NaN и inf строковые входные данные, правильно? Я все еще не уверен, является ли эта логика исчерпывающей.

2. Я не мог представить случай, когда это не должно работать. И yes isfinite также охватывает случай, когда ввод есть inf , а ~isnan это не так. В общем, у вас есть различные варианты для первого случая (isfinite должен охватывать все), но обойти isreal это невозможно.

3. Хммм… Хорошо, я хорошо отношусь к этому ответу, но я собираюсь немного подождать, прежде чем согласиться, чтобы посмотреть, появится ли что-нибудь еще. Спасибо

4. Взгляните на мое другое предложение, но на самом деле в этом нет смысла 😉