2013-07-26 10 views
7

Mam kilka liczb zmiennoprzecinkowych, które muszę wyprowadzać z programu Fortran. Załóżmy, że maksymalna liczba może wynosić 999,9999 i wszystkie są nieujemne. Muszę zerami przed wszystkimi numerami mniej niż 100.Jak zabezpieczyć wyjście zmiennoprzecinkowe Fortran z zerami wiodącymi?

Na przykład, jeśli mam 25.6893782, 245.354567 i 1.2345678, muszę wydrukować je w tworzą coś jak

025.6894 
245.3546 
001.2346 

Jak mogę to zrobić? Byłoby całkiem łatwo z deskryptorem edycji T, gdybym wiedział, że na przykład wszystkie liczby będą między 10 a 99, coś w tym stylu. Ale nie ma sposobu, bym wiedział o tym wcześniej.

Odpowiedz

10

Działa to dla mnie

real :: areal 

następnie

write(*,'(i3.3,f0.6)') int(areal),areal-int(areal) 
+0

, wciąż myśląc o tym, wymyśliłem coś takiego, ale twoja droga jest znacznie bardziej elegancka. Dzięki. –

0

Nie wierzę, że istnieje edit descriptor, że robi to, co chcesz, ale można zasymulować z if -statement:

if(var < 10) then 
    write(*,'(a,f6.4)') '00',var 
else if(var < 100) then 
    write(*,'(a,f7.4)') '0',var 
else 
    write(*,'(f8.4)') var 
endif 
+0

Jeśli wartość wynosi prawie 10, powiedzmy 9.999999, czy instrukcja "write" sformatuje ją jako "10.0000", w ten sposób generując wynik "0010.0000" zamiast pożądanego "010.0000"? –

+0

To da pożądany '010.0000', ale jeśli masz' 9.9999', wyświetli '009.9999'. –

+0

Jak to działa? Czy 9.999999 nie przejdzie testu 'var <10', czego wynikiem będzie zapisanie" 00 ", a następnie" 10.0000 "? –

2

Zero-wyściółka może być wykonana dla pól całkowitych, więc jeśli wydrukował wynik jako dwa oddzielne pola, które być może byłyby w stanie go zrealizować. Oto sposób, który jest mniej niż ładny, ale działa. Powiedzieć x jest wartością chcesz wydrukować:

DOUBLE PRECISION x 
CHARACTER*6 y 

x = 123.4567 

WRITE(y,'(F6.4)') x-int(x) 


WRITE(*,'(I3.3,A5)') int(x), y(2:5) 

y jest zadeklarowana jako CHARACTER*6 ponieważ musi trzymać ułamkową część numeru (4 miejsc po przecinku), wiodącego zera i punktu dziesiętnego. Można to łatwo zmienić, jeśli chcesz wyświetlić więcej miejsc dziesiętnych, ale byłoby to trudniejsze, gdybyś chciał pokazać zmienną liczbę miejsc po przecinku.

Deskryptor pola I3.3 oznacza "wydrukuj liczbę całkowitą o maksymalnej szerokości pola równą 3, a lewą z zerami, aby zawsze były 3 cyfry". Podczas drukowania wartości bierzemy y(2:5), aby usunąć początkowe zero.

Szczęśliwe kodowanie!

+0

Wymyśliłem coś podobnego. Ty i ja w zasadzie robimy to, co robił Mark Wysokiej Mocy, ale jego sposób jest o wiele bardziej zwarty. Dzięki za pomoc. –

+0

Widziałem poprawkę High Performance Mark i zgadzam się. Nie wiedziałem o specyfikatorze szerokości "0", ale jest o wiele lepszym rozwiązaniem. Miło, że mogłem pomóc. –

1

To jest sztuczka, którą użyłem w MS BASIC na komputerach Commodore PET w późnych latach siedemdziesiątych. Kod został zmodyfikowany dla liczb ujemnych. Jeśli chcesz pozytywne numery mieć wiodącą +, wystarczy zmienić ostatni znak signchr do „+”

subroutine leadingzero(x) 
    real x 
    character(len=16) str 
    character, dimension(3):: signchr = (/'-', ' ', ' ' /) 
    write(str,'(F9.4)') 1000.0 + abs(x) 
    write(*,*) signchr(int(sign(1.0,x)) + 2), str(2:) ! drop the 1 
end subroutine leadingzero 

program main 
    call leadingzero(0.01) 
    call leadingzero(0.1) 
    call leadingzero(2.532) 
    call leadingzero(9.9999) 
    call leadingzero(9.999999) 
    call leadingzero(10.987) 
    call leadingzero(123.456) 
    call leadingzero(0.0) 
    call leadingzero(-0.01) 
    call leadingzero(-0.1) 
    call leadingzero(-2.532) 
    call leadingzero(-9.9999) 
    call leadingzero(-9.999999) 
    call leadingzero(-10.987) 
    call leadingzero(-123.456) 
end program 

Edycja - powrót wynik w ciąg

subroutine leadingzerostr(x, str_temp) 
    real x 
    character(*) str_temp 
    character(len=10) str 
    character, dimension(3):: signchr = (/'-', ' ', ' ' /) 
    write(str,'(F10.4)') 10000.0 + abs(x) 
    str_temp = str 
    str_temp(1:1) = signchr(int(sign(1.0,x)) + 2) 
end subroutine leadingzerostr 
+0

Czy możesz podać rozwiązanie, jeśli wartość jest ujemna? –

+0

@Judge_Dredd Kod zaktualizowany dla wartości -ve – cup

+0

To rozwiązanie nie daje poprawnego wyniku. –

Powiązane problemy