How to determine if a string can be converted to a numerical value?

38 visualizaciones (últimos 30 días)
For example, I have two strings, 'abc' and '123'. I want to process them differently. If it is '123', I would use str2num to convert it to a number for my operation. If it is 'abc', I would do some other operation. My question is how to write the sentence to detect which of them can be converted to a numerical value?
Thank you.

Respuesta aceptada

Walter Roberson
Walter Roberson el 23 de Mzo. de 2011
Determining whether a string represents a legal numeric value is fairly messy if you wish to accept complete exponential floating point sequence and yet detect all malformed numbers. By and large it is the decimal point that causes the most problems, as it is optional but when it appears there can be numbers before it and/or numbers after it, but it is not legal for it to appear without numbers. .0e-1 is legal, 0.e-1 is legal, 0.0e-1 is legal, but .e-1 is not. The work to recognize whether a number is legal or not is very nearly the same as the work to determine the value of the number.
If you want to accept numbers but not 'nan' or one of the infinities, then you can use (e.g.)
all(ismember(potentialnumber, '0123456789+-.eEdD'))
and if it is true then try the conversion, and if the conversion fails then or the test was false, it was a string. You can improve on this test, such as by pre-checking whether the number of exponent characters is at most 1.

Más respuestas (3)

Kaustubha Govind
Kaustubha Govind el 23 de Mzo. de 2011
[num, status] = str2num(str)
status=0 if conversion is not successful, and 1 if it is.
  4 comentarios
Matt Tearle
Matt Tearle el 23 de Mzo. de 2011
If you have a set of values you consider "missing", you don't have many options but to determine those by brute-force. But you might as well still do the conversion then test the result. Eg
num = str2num(str)
if (isempty(num) | ~isfinite(num) | (num==-999))
% not a valid number, do alternate thing
else
% number, go ahead
end
Florian Schwaiger
Florian Schwaiger el 23 de Feb. de 2015
Old thread but: you need to know that str2num uses eval internally. The following also passes this test:
>> [a, b] = str2num('SomeClassName')
a =
1x1 SomeClassName
b =
1

Iniciar sesión para comentar.


Alexander
Alexander el 26 de Feb. de 2016
The following code will give you the output of str2double with an element-wise status output like str2num:
function [X,status] = MYstr2double(str)
X = str2double(str);
status = ~xor(strcmpi(strtrim(str),'NaN'),isnan(X));
end
This code works with in input that is a string or cell array of strings

Leon
Leon el 4 de Jun. de 2019
Old thread, but the function 'isfloat" will do the trick.

Categorías

Más información sobre Data Type Conversion en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by