Clicky

Printing Left-Justified Values in Fortran

July 31, 2011

By default, Fortran right-justifies numerical and string output when printing to the screen or to a file. For example, the following code

integer :: i = 42
real :: r = 46.2
print '(3a8)', 'String', 'Integer', 'Real'
print '(a8,i8,f8.2)', 'Label', i, r

produces

  String Integer    Real
   Label      42   46.20

One approach to left-align the CHARACTER literals above is to simply add the appropriate number of spaces to shift them to the left, making each exactly eight characters long:

print '(3a8)', 'String  ', 'Integer ', 'Real    '
print '(a8,i8,f8.2)', 'Label:  ', i, r

Alternatively, storing them in CHARACTER variables of the appropriate length will also work:

character(len=8), dimension(3) :: header = (/ 'String ', 'Integer', 'Real   ' /)
character(len=8) :: c = 'Label:'
print '(3a8)', header
print '(a8,i8,f8.2)', c, i, r

Both of these methods yield the following output:

String  Integer Real
Label         42   46.20

But the numerical values are not left-justified (although it’s hard to tell from above without counting characters since there is no surrounding output).

For numerical values, the usual approach is to use an internal write to first write the formatted values to character strings of length eight, and then print the left-justified strings.

character(len=8) :: i_char, r_char
write (i_char, '(i8)') i
write (r_char, '(f8.2)') r
print '(3a8)', c, adjustl(i_char), adjustl(r_char)

This produces the following output, with all fields being left justified:

String  Integer Real
Label   42      46.20

Note that this method makes use of the ADJUSTL intrinsic introduced in Fortran 90. Internal writes can also be used in FORTRAN 77 to achieve the same result, but with a little more work to carry out the steps performed by ADJUSTL.

See leftjust.f90 for code used in the examples above.