#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. Взгляните на мое другое предложение, но на самом деле в этом нет смысла 😉