From char to number

861 views (last 30 days)
paul kaam
paul kaam on 12 May 2015
Edited: Philipp Prestel on 24 Jun 2023
Hi ,
I have this:
"10:58",297.98,0.25,0.15,66.5,1.194,-0.31,-0.27,71.1,0.966,""
it is of type char.
it contains the following numbers and one time value:
10:58 (time)
297.98
0.25
0.15
66.5
1.194
-0.31
-0.27
71.1
0.966
how can i convert this char type to individual numbers? I could not find it on internet i tried multiple things with char2[anything]
many thanks,
Paul

Answers (4)

Robbin van Hoek
Robbin van Hoek on 12 May 2015
try str2num!
>> str2num('6.1')
ans =
6.1000
  1 Comment
paul kaam
paul kaam on 12 May 2015
but it is of type char, if i do str2num i get the result : ans = [ ]

Sign in to comment.


Walter Roberson
Walter Roberson on 12 May 2015
S = '"10:58",297.98,0.25,0.15,66.5,1.194,-0.31,-0.27,71.1,0.966,""';
C = textscan(S, '"%[^"]",%f,%f,%f,%f,%f,%f,%f,%f,%f,%*s', 'CollectOutput', 1);
thetimestr = C{1}{1};
thenums = C{2};
  9 Comments
paul kaam
paul kaam on 12 May 2015
i do not understand what u mean with that? rt?
paul kaam
paul kaam on 12 May 2015
Now it is between '' with cellstr:
>> S
S =
"12:15",333.98,0.06,0.06,65.3,0.975,0.02,0.10,72.2,1.002,""
>> cellstr(S)
ans =
'"12:15",333.98,0.06,0.06,65.3,0.975,0.02,0.10,72.2,1.002,""'
>> C = textscan(ans, '"%[^"]",%f,%f,%f,%f,%f,%f,%f,%f,%f,%*s', 'CollectOutput', 1); Error using textscan First input must be of type double or string.

Sign in to comment.


omax ali
omax ali on 5 Nov 2020
i just write this for new ones who searching:
to change some value like a=["1","2.2","3",......] to number format we can do as:
b=char(a);
c=str2num(b);
c gives you the numbers.
  1 Comment
Walter Roberson
Walter Roberson on 6 Nov 2020
Edited: Walter Roberson on 6 Nov 2020
a=["1","2.2","3"]
a = 1×3 string array
"1" "2.2" "3"
double(a)
ans = 1×3
1.0000 2.2000 3.0000
This relies upon a being datatype string and not cell array of character vector:
a = {'1', '2.2', '3'}
a = 1x3 cell array
{'1'} {'2.2'} {'3'}
str2double(a)
ans = 1×3
1.0000 2.2000 3.0000

Sign in to comment.


Philipp Prestel
Philipp Prestel on 24 Jun 2023
Edited: Philipp Prestel on 24 Jun 2023
Again for someone stumbling over this:
if this is your char array: ' "10:58 ", 297.98, 0.25, 0.15, 66.5, 1.194, -0.31, -0.27, 71.1, 0.966,"" '
and these are your values:
val1 (1,1) datetime = 10:58
val2 (1,1) double = 297.98
...
val10 (1,1) double = 0.966
First of all, i want to say something about the array itself; you don't need any qotation marks around the time, it's arbitrary since you already have a char array. Next is the "" at the end, if it is supposed to be a empty string it's fine, otherwise remove it.
This applies if you're indexing stays the same for other arrays you may want to decode, if the indexing varries for some reasons there are better ways of doing dynamic identification.
Generally, I would advise against using char arrays to pass around data. If you have to do it or read from a text file make sure what you save is compatible with sscanf, fscanf, readtable or anything using Matlabs format spec. Json works as well with jsonencode and jsondecode.
if you can't get around it, I found the following to work:
value_char = '"10:58",297.98,0.25,0.15,66.5,1.194,-0.31,-0.27,71.1,0.966,""';
value_char = erase(value_char,'"');
value_cellstr = split(value_char,',');
time_str = string(value_cellstr{1});
value_time = datetime(time_str,InputFormat='HH:mm')
value_time = datetime
24-Jun-2023 10:58:00
num_cellstr = value_cellstr(2:end-1);
nums = cellfun(@str2num,num_cellstr)
nums = 9×1
297.9800 0.2500 0.1500 66.5000 1.1940 -0.3100 -0.2700 71.1000 0.9660
last_str = erase(value_cellstr{end},'"');
last_str = string(last_str)
last_str = ""
This isn't the best implementation but it shows what you can do. Split the array into cell string using ',' as a delimiter then convert the individual cellstirngs to the format you want.
If you want it more adaptive you can also write a small function to use for cellfun, which identifies what type you want a value in and then does the conversion. Which might look something like this:
value_char = '"10:58",297.98,0.25,0.15,66.5,1.194,-0.31,-0.27,71.1,0.966,""';
value_cellstr = split(value_char,',');
nums = cellfun(@convert2type,value_cellstr,UniformOutput=false)
nums = 11×1 cell array
{["10:58" ]} {[297.9800]} {[ 0.2500]} {[ 0.1500]} {[ 66.5000]} {[ 1.1940]} {[ -0.3100]} {[ -0.2700]} {[ 71.1000]} {[ 0.9660]} {["" ]}
function A_convert = convert2type(A)
arguments
A char {mustBeTextScalar}
end
if contains(A,'"')
A_convert = erase(A,'"');
A_convert = string(A_convert);
else
A_convert = str2num(A);
end
end
If you want the time as a datetime just add a condition with ':' to the function in the function.
Bit of along answer but I hope it helps someone having to work with these things.
Edit: By default datetime automatically determines the display format if you only want daytime use Format='preserveinput'

Categories

Find more on Characters and Strings in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!