'num2str' Error
18 次查看(过去 30 天)
显示 更早的评论
Trying to have this result
Details- name:Tara Wilkins, ID:12344567, address:123 Happy Drv
Having errors when using num2str for the ID part, what am I doing wrong?
students(i) = struct();
students(1).ID = 12344567;
students(1).name = 'Tara Wilkins';
students(1).address = '123 Happy Drv';
students(2).ID = 15432123;
students(2).name = 'Fred Bloggs';
students(2).address = '125 Happy Drv';
students(3).ID = 34765765;
students(3).name = 'Jo Tamry';
students(3).address = '321 Happy Drv';
for i = 1:length(students)
disp(['Details- name:' ,students(i).name, 'ID:',students(i).[num2str(ID)], ', address:' ,students(i).address])
end
*Bolded the part that is the issue*
0 个评论
采纳的回答
Guillaume
2019-8-15
Yes, what you have written makes no sense at all. You want to convert the numeric content of students(i).ID to text, so that's what you should pass to num2str:
... num2str(students(i).ID)
However, instead of building your display string by concatenation and num2str, I would recommend you use sprintf. To me, it makes the whole thing easier to read:
disp(sprintf('Details- name: %s, ID: %d, address: %s', students(i).name, students(i).ID, students(i).address));
Note that I've added some spaces and commas between the different entries that your disp was missing. It's a lot easier with sprintf to see what the final result will look like.
You could also use fprintf directly instead of disp(sprintf(...)):
fprintf('Details- name: %s, ID: %d, address: %s\n', students(i).name, students(i).ID, students(i).address); %added a \n, line return for fprintf
2 个评论
Guillaume
2019-8-15
The extra concatenation inside the outer concatenation is pointless
disp(['Details- name:' ,students(i).name, ', ID:', num2str(students(i).ID), ', address:', students(i).address])
would do the same.
Note that
students(i) = struct;
would only work if i is already defined (probably why it worked in octave, you already had an i variable). Even if it were replaced by students(3) = struct it wouldn't do what you want.
student = [];
or
clear student
would be better in this case.
Or you could create the structure in one go:
student = struct('ID', {12344567, 15432123, 34765795}, ...
'name', {'Tara Wilkins', 'Fred Bloggs', 'Jo Tamry'}, ...
'address', {'123 Happy Drv', '125 Happy Drv', '321 Happy Drv'});
Havent been taught about fprintf yet only 3rd week in the topic.
Nothing stops you from getting ahead of your course. You can read how fprintf works. It's a much better way to build text than string concatenation.
更多回答(1 个)
Steven Lord
2019-8-15
Since you're using release R2019a, rather than using char array concatenation or sprintf I would append strings together.
students(1).ID = 12344567;
students(1).name = 'Tara Wilkins';
students(1).address = '123 Happy Drv';
S = "Details - name: " + students(1).name + ...
" ID: " + students(1).ID + ...
" address: " + students(1).address
MATLAB will automatically convert the number 12344567 to the text data "12344567" when appending it to the rest of the string S. The ellipses aren't necessary, but I wanted to avoid a long line of code since it would add scroll bars to my message.
Though if your format isn't constrained (which it probably is, since this sounds like a homework assignment) I'd probably break name, ID, and address onto separate lines for readability.
S = "Details" + newline + "Name: " + students(1).name + newline + ...
"ID: " + students(1).ID + newline + ...
"address: " + students(1).address
and maybe indent the fields by one or two tab stops or a couple spaces.
tab = sprintf('\t');
S = "Details" + newline + ...
tab + "Name: " + students(1).name + newline + ...
tab + "ID: " + students(1).ID + newline + ...
tab + "address: " + students(1).address
spaces = blanks(7);
S2 = "Details" + newline + ...
spaces + "Name: " + students(1).name + newline + ...
spaces + "ID: " + students(1).ID + newline + ...
spaces + "address: " + students(1).address
1 个评论
Guillaume
2019-8-15
It might just be me, but I find it a lot easier to picture what the output will look like with
S = sprintf('Details- name: %s, ID: %d, address: %s\n', bunchofvariables) %or "" for string output
than with:
S = "Details - name: " + students(1).name + ...
" ID: " + students(1).ID + ...
" address: " + students(1).address
which is cluttered by variable names in the midst of the text.
The newline and tab add even more clutter compared to:
S = sprintf('Details\n\tname: %s\tID: %d\taddress: %s\n', bunchofvariables) %or "" for string output
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Type Conversion 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!