Fortran: Integer to String Example

12,832

Solution 1

Okay, so I figured out the problem. Consider the following modifications to your code:

program test
implicit none
character(10) myString
character(1) a,b,c,d,e,f
integer::i,j,k
do i=900,901,1
   j=900
   k=i*j
   write(*,*)'k =', k
   write(myString,'(i10)') k
   write(*,*)'myString = ', myString
   a=myString(1:1)
   b=myString(2:2)
   c=myString(3:3)
   d=myString(4:4)
   e=myString(5:5)
   f=myString(6:6)
   write(*,*) a
   write(*,*) b
   write(*,*) c
   write(*,*) d
   write(*,*) e
   write(*,*) f
   if (d==f) then
       print*,'hobla'
   else
       print*,'fobla'
   end if
end do

stop
end program test

The resulting output is:

 k =      810000
 myString =     810000




 8
 1
 fobla
 k =      810900
 myString =     810900




 8
 1
 fobla

This happens because the I format right-justifies numbers when printed. So there is a bunch of leading white-spaces because your number is only 6 digits while your string you are writing into is 10. So you get 4 leading spaces.

If you change your format string so you have:

write(myString,'(i10.10)') k

then instead of padding with spaces it will pad with 0's. That way you can always have digits to compare if you would rather.

Solution 2

This statement

write(myString,'(i10)') k

writes the value of k into a 10-character field. Since k has only 6 significant digits the first 4 characters in myString are filled with blanks. Then you assign the first 6 characters of myString (that is 4 blanks and the digits 8 and 1) to the variables a,b,c,d,e,f and print them out -- 4 blanks and 2 digits.

Try printing out the other characters in positions 7..10 of myString and you should see your 'missing' digits.

Share:
12,832
stupidity
Author by

stupidity

Updated on June 14, 2022

Comments

  • stupidity
    stupidity almost 2 years

    I'm trying to write a simple Fortran code, for practicing. It is supposed to multiply numbers in a range. Each time, the resulting product is converted into a string because I want to see if it consists of the same digits.

    I tested the way I transform an integer into a string and typed the components of the string, and everything was going correctly. Then, I need to compare the components of the string, for which I use string(number:number). But I couldn't get the code to do this correctly.

    Here's the code and the output:

    program test
    implicit none
    character(10) myString
    character(1) a,b,c,d,e,f
    integer::i,j,k
    do i=900,901,1
            j=900
            k=i*j
            write(*,*)'k =', k
            write(myString,'(i10)') k
            write(*,*)'myString = ', myString
            a=myString(1:1)
            b=myString(2:2)
            c=myString(3:3)
            d=myString(4:4)
            e=myString(5:5)
            f=myString(6:6)
            print*,a,b,c,d,e,f
            if (d==f) then
                print*,'hobla'
            else
                print*,'fobla'
            end if
    end do
    
    stop
    end program test
    

    So I defined characters: a,b,c,d,e,f to contain the components of the string. And used myString(i:i) to locate each component and store it in one of the characters a,b,c,d,e,f. But it seems only the first two are working correctly, the rest is not being stored!

    Output:

     k =      810000
     myString =     810000
         81
     fobla
     k =      810900
     myString =     810900
         81
     fobla
    

    Notice 81. This was supposed to give 810000 the first time, and print "hobla". And give 810900 the second time and print "fobla". But this didn't happen!

    Can anybody show me how to let myString accept the zeros as characters?