function f_format, minval, maxval, factor, length
 On_error,2

 if N_params() LT 3 then begin                                         
    print,'Syntax  - fmt = F_FORMAT( minval, maxval, factor, [ length ])'
    return,''
 endif

 if N_params() LT 4 then length = 5 else length = length > 2
 factor = 1.

 RANGE: if ( maxval GT 0) then begin 
       mxlog = fix( alog10( maxval ) ) 
       mxval =  (mxlog>0) + 1 
 endif else if ( maxval LT 0) then begin
       mxlog =   fix( alog10( abs( maxval ) ) ) 
       mxval =  (mxlog>0) + 2 
 endif else begin
        mxlog = 0
        mxval = 1
 endelse

 if ( minval GT 0 ) then begin 
       mnlog = fix( alog10( minval ))
       mnval =  (mnlog>0) + 1 
 endif else if ( minval LT 0) then begin
       mnlog =   fix(alog10(abs(minval))) 
       mnval =   (mnlog>0) + 2 
 endif else begin
        mnlog = 0
        mnval = 1
 endelse

 if ( mnlog LT 0 ) and ( mxlog LT 0 ) then begin        ;All numbers are < 1.0
      expon = max( [ mnlog,mxlog ] ) -1
      factor = factor*10.^(expon)
      maxval = maxval / factor
      minval = minval / factor
      goto, RANGE  
 endif

 dif = abs( mxlog - mnlog )
 if ( dif GE length-3 ) then begin
     mxlen = max([mnlog,mxlog])
     factor =  factor*10.^(mxlen-(length-3))    
     abs = 0

 endif else begin

 TEST:  tpairv = abs( [mxval,mnval] ) 
        test   = max( tpairv )          

 if ( test LE length-3 ) then begin        ;No factor needed
      abs = length - test - 2         
 endif else begin
     expon = min( [mxlog, mnlog] ) 
     if expon EQ 0 then expon = 1         ;Avoid infinite loop
     factor = factor*10.^(expon)
     mxval -= expon
     mnval -= expon
     goto, TEST 
 endelse 
 endelse

 if abs EQ 0 then begin
        factor = factor/10
    return,'I' + strtrim(length,2)
 endif else return,'F' + strtrim( length, 2 ) + '.' + strtrim( abs, 2 )
 
 end