带前导零的浮点输出格式

Floating point output format with leading zeros

例如,如果我做出这些定义:

Real, parameter :: No_01 = 2.34
Real, parameter :: No_02 = 34.56

我想用 F 的格式写这些变量:

Character(*), parameter :: FMT_01 = '(2x,F4.2)'
Character(*), parameter :: FMT_02 = '(2x,F5.2)'

写入屏幕的结果为:

Write(*, FMT_01 ) NO_01 => 2.34
Write(*, FMT_02 ) NO_02 => 34.56

是否有任何类型的 F 格式可用于获取此写入结果: 结果是:

!Correct result          !Not correct result
002.340 Something         2.340 Something
034.560 Something         34.560 Something

How to pad floating point output with leading zeros? 的答案不适用,因为值可能为负数。

如果您对两者都使用 F0.2,那么您将得到:

  2.34
  34.56

可以接受吗?

对于不带前导零的恒定字段宽度,您可以指定一种具有假定最大字段宽度的格式。负号是自动处理的,值默认是右调整的。例如:

character(len=6) :: form
real :: rv1, rv2

! Format: floating point, field width=8 (includes the "."), decimal places=2
form = '(f8.2)'  
rv1  = -12.34
rv2  =  123.45

write(*,form) rv1
write(*,form) rv2

! example output. notice the two leading spaces are just blanks, but the 
! field width ("8") is constant and the ("2") decimal places are aligned:
  -12.34
  123.45

如果你想要一个恒定的字段宽度前导零,那么你必须使用你已经在你的问题中链接到的 this SO answer 处显示的技术,以及@agentp 在评论中建议的技巧。我不知道你是否完全理解,所以这里有一个子程序来演示这些想法:

subroutine leadingzeros(rv)
    real, intent(in) :: rv
    ! local vars
    character(len=11) :: form

    if (int(rv)>0) then
        form='(i4.4,f0.2)'   ! allow a total of 4 leading zeros.
    else
        form='(i4.3,f0.2)'   ! "-" sign takes up one space, so 3 leading zeros remain.
    endif

    ! handle negative values as suggested by agentp
    write(*,form) int(rv), abs(rv-int(rv))
end subroutine leadingzeros

现在,当您调用 leadingzeros 时,输出如下所示:

! example output from 'call leadingzeros(rv1)'
-012.34
! example output from 'call leadingzeros(rv2)'
0123.45

有两种获取问题结果的方法:

Program Main

Implicit none

Open(15,File='Output.txt')

  Write(15,'(1x,a,1x,"j",1x,a,1x,"Juhu!")') Writing_01(67.45),Writing_01(-4.04)
  Write(15,'(1x,a,1x,"j",1x,a,1x,"Juhu!")') Writing_02(67.45),Writing_02(-4.04)

Close(15)

Contains

Function Writing_01 ( Deg ) Result ( Str )

Real,intent(in) :: Deg
Character(:),allocatable :: Str
Character(len = 15 ) :: Str_temp

If ( int( Deg ) > 0 ) then

    Write(Str_temp , '(F0.2)' ) 100000.0 + Deg
    Str_temp = Str_temp(2:)

Else

    Write(Str_temp, '(F0.2)' ) 100000.0 + abs(Deg)
    Str_temp = "-"//Str_temp(3:)

Endif

Str = trim ( adjustl ( Str_temp ))

End Function Writing_01

Function Writing_02 ( Deg ) Result ( Str_temp )

Real,intent(in) :: Deg
Character(:),allocatable :: Str_temp
Character(len=1561) :: Form_02 , Res

If (int( Deg ) > 0 ) then

  Form_02 = '(i5.5,f0.2)'   ! allow a total of 4 leading zeros.

Else

  Form_02 = '(i5.4,f0.2)'   ! "-" sign takes up one space, so 3 leading zeros remain.

Endif

Write(Res , Form_02 )  int( Deg ), abs( Deg - int( Deg ) )

Str_temp = trim ( adjustl ( Res ))

End Function Writing_02

End program Main