2013-07-26 38 views
7

Tôi có một số số dấu chấm động mà tôi cần để xuất từ ​​một chương trình Fortran. Giả sử số lượng tối đa có thể là 999.9999 và tất cả đều không âm. Tôi cần zero-đệm ở phía trước tất cả các số dưới 100.Làm thế nào để pad đầu ra điểm nổi Fortran với số không đứng đầu?

Ví dụ, nếu tôi có 25,6893782, 245,354567, và 1,2345678, tôi cần phải in chúng ra trong một hình thức giống như

025.6894 
245.3546 
001.2346 

thế nào tôi có thể làm được không? Nó sẽ khá dễ dàng với mô tả chỉnh sửa T nếu tôi biết điều đó, ví dụ, tất cả các số sẽ nằm trong khoảng từ 10 đến 99, giống như vậy. Nhưng không có cách nào để tôi biết trước thời hạn.

Trả lời

10

này làm việc cho tôi

real :: areal 

sau đó

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

trong khi tiếp tục suy nghĩ về nó, tôi đã đưa ra một cái gì đó như thế này, nhưng cách của bạn là thanh lịch hơn nhiều. Cảm ơn. –

0

Tôi không tin rằng có một edit descriptor mà những gì bạn muốn, nhưng bạn có thể mô phỏng nó với một 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

Nếu một giá trị gần 10, nói 9.999999, câu lệnh 'write' có phải là“ 10.0000 ”, do đó tạo ra đầu ra“ 0010.0000 ”thay vì“ 010.0000 ”mong muốn? –

+0

Nó sẽ cung cấp cho '010.0000' mong muốn, nhưng nếu bạn có' 9,9999', nó sẽ xuất ra '009.9999'. –

+0

Tính năng này hoạt động như thế nào? Sẽ không 9.999999 vượt qua bài kiểm tra 'var <10', kết quả là viết" 00 "theo sau là" 10.0000 "? –

2

Zero-đệm có thể được thực hiện đối với các trường số nguyên, vì vậy nếu bạn in kết quả dưới dạng hai trường riêng biệt mà bạn có thể làm cho nó xảy ra. Đây là một cách nhỏ hơn khá, nhưng hoạt động. Nói x là giá trị mà bạn muốn in:

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 được khai báo là một CHARACTER*6 vì nó cần phải giữ phần phân đoạn của số điện thoại (4 chữ số thập phân), một số không hàng đầu, và một dấu thập phân. Điều này có thể dễ dàng thay đổi nếu bạn muốn hiển thị nhiều chữ số thập phân hơn, mặc dù nó sẽ phức tạp hơn nếu bạn muốn hiển thị số lượng chữ số thập phân thay đổi.

Trình mô tả trường I3.3 có nghĩa là "in một số nguyên có chiều rộng trường tối đa là 3 và pad sang trái bằng số 0 để luôn có 3 chữ số". Khi in ra giá trị chúng tôi lấy y(2:5) để loại bỏ số 0 đứng đầu.

Mã hóa vui vẻ!

+0

Tôi nghĩ ra một thứ tương tự. Bạn và tôi về cơ bản đang làm những gì High Performance Mark đã làm, nhưng cách của anh ấy nhỏ gọn hơn nhiều. Cảm ơn đã giúp đỡ. –

+0

Tôi đã thấy bản sửa lỗi của Hiệu suất cao và tôi đồng ý. Tôi không biết về specifier '0' width nhưng nó là một giải pháp tốt hơn nhiều. Vui mừng được giúp đỡ. –

1

Đây là mẹo tôi đã sử dụng trong MS BASIC trên PET hàng hóa vào cuối những năm 70. Mã đã được sửa đổi cho số âm. Nếu bạn muốn các số dương có a + hàng đầu, chỉ cần thay đổi ký tự cuối cùng của signchr để '+'

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 

Edit - trở về kết quả trong một chuỗi

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

Bạn có thể cung cấp giải pháp nếu giá trị âm? –

+0

@Judge_Dredd Mã được cập nhật cho các giá trị -ve – cup

+0

Giải pháp đó không đưa ra kết quả chính xác. –