fprintf automatic spacing for strings of different lenghts
48 views (last 30 days)
Show older comments
Hi,
how do i evenly space if I print this text using fprintf, in the example 1 below is what I get but I would like to output in the format of example 2, is there a way to automate the spacing if we the consecutive places and I have a string(name of place n) of different lenghts?
where cities is an array of strings show in the examples below and paths is a vector
for i = 1:(length(path)-1)
fprintf('%s --> %s (Distance = %s km)\n', cities(path(i)), cities(path(i+1)), num2str(matDist(min(... [path(i) path(i+1)]), max([path(i) path(i+1)]))));
end
fprintf('%s --> %s (Distance = %s km)\n', cities(path(end)), cities(path(1)), num2str(matDist(min(... [path(1) path(end)]), max([path(1) path(end)]))));
Example 1
Path and distance
----------------------------------------
Case fileName | Origin = Vila Ló(city 1)
----------------------------------------
Total Distance = 414 km
Vila Ló --> Pião (Distance = 46 km)
Pião --> Chão de Frades (Distance = 73 km)
Chão de Frades --> Salmorrete (Distance = 205 km)
Salmorrete --> Tortolindo (Distance = 33 km)
Tortolindo--> Vila Ló (Distance = 57 km)
Example 2
Path and distance
----------------------------------------
Case fileName | Origin = Vila Ló(place 1)
----------------------------------------
Total Distance = 414 km
Vila Ló --> Pião (Distance = 46 km)
Pião --> Chão de Frades (Distance = 73 km)
Chão de Frades --> Salmorrete (Distance = 205 km)
Salmorrete --> Tortolindo (Distance = 33 km)
Tortolindo --> Vila Ló (Distance = 57 km)
2 Comments
Dyuman Joshi
on 16 Oct 2023
Moved: Dyuman Joshi
on 16 Oct 2023
Vectorized version -
%Sample data
cities1 = ["Vila Ló", "Pião", "Chão de Frades", "Salmorrete", "Tortolindo"];
cities2 = cities1([2 3 4 5 1]);
distance = [46 73 205 33 57];
%Convert the distance to strings with the desired precision
distance = compose("%d", distance);
n = repelem(max(strlength(cities1)),1,numel(cities1));
%If you need to add more spaces in between, modify n accordingly
%For e.g
%n = n+5;
fprintf('%-*s --> %-*s (Distance = %s km)\n', [n;cities1;n;cities2;distance])
Accepted Answer
Voss
on 16 Oct 2023
cities = ["Pasadena","Urbana-Champaign","Cambridge"];
path = 1:numel(cities);
d = [3200 1600 4800]; % using a vector of distances since I don't have your function matDist()
n = max(strlength(cities));
for i = 1:(length(path)-1)
fprintf('%-*s --> %-*s (Distance = %.f km)\n', n, cities(path(i)), n, cities(path(i+1)), d(i));
end
fprintf('%-*s --> %-*s (Distance = %.f km)\n', n, cities(path(end)), n, cities(path(1)), d(end));
3 Comments
Walter Roberson
on 16 Oct 2023
Using the %* facility is a bit obscure, but should work fine for this purpose.
More Answers (1)
Florian Bidaud
on 16 Oct 2023
Edited: Florian Bidaud
on 16 Oct 2023
Something like this should do
cities = ["Vila Lo" "Piao" "Chao de Frades" "Salmorrete" "Tortolindo"];
path = [1 2 3 4 5];
distance = [46 73 205 3357]; % Should be replaced by your function matDist
max_city_len = max(strlength(cities));
for i = 1:(length(path)-1)
fprintf('%s %s --> %s %s (Distance = %s km)\n', cities(path(i)),repmat(' ',1,max_city_len-strlength(cities(path(i)))+1), repmat(' ',1,max_city_len-strlength(cities(path(i+1)))+1), cities(path(i+1)), num2str(distance(i)));
end
fprintf('%s %s --> %s %s (Distance = %s km)\n', cities(path(end)), repmat(' ',1,max_city_len-strlength(cities(path(end)))+1), repmat(' ',1,max_city_len-strlength(cities(path(1)))+1), cities(path(1)), num2str(distance(end)));
See Also
Categories
Find more on Environment and Settings in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!