2010-10-06 16 views

Trả lời

3

Với tất cả những thứ được chỉ định trong ISO C99, điều này là không thể. Tài liệu cho các thông số chuyển đổi cho biết:

f, F: [...] Nếu ký tự dấu thập phân xuất hiện, ít nhất một chữ số xuất hiện trước nó. [...]

e, E: [...] có một chữ số (đó là khác không nếu đối số là khác không) trước khi nhân vật số thập phân điểm [...]

g, G : [...] được chuyển đổi sang phong cách f hoặc e [...]

Kể từ khi specifiers chuyển đổi khác sẽ không in một số dấu chấm động thập phân, điều này là không thể cả. Trừ khi bạn tìm thấy tiện ích mở rộng của nhà cung cấp giới thiệu một trình biến đổi chuyển đổi khác. Nhưng sau đó chương trình của bạn sẽ không được C hợp lệ nữa.

Cách giải quyết tốt nhất mà nói đến cái tâm của tôi là:

double number = 0.5; 
char buf[80]; 
char *number = buf; 
if (snprintf(buf, sizeof buf, "%f", number) <= 0) 
    goto cannot_happen; 

while (*number == '0') 
    number++; 
printf("%s\n", number); 
1

Trong một từ: No ...

+0

printf() không thể, nhưng chúng tôi có thể! –

+0

Có 'printf' có thể. Xem câu trả lời của tôi. –

+0

@R ..: Không thể. Xem bình luận của tôi cho câu trả lời của bạn. – DevSolar

-3

Xem printf spec và phần chính xác. Bạn có thể làm printf("%+0.4f", -0.5);

+0

xin lỗi đã không hoạt động – sharkin

+2

Vâng? Downvote di chuột qua văn bản đọc: "Câu trả lời này không hữu ích". Điều này áp dụng vì câu trả lời của bạn không giải quyết được câu hỏi của OP. (Không * của tôi * downvote, nhưng vẫn - không có lý do để có được cá nhân.) – DevSolar

+1

-1 cho là một jerk hoàn thành trong các bình luận; nó không được cho là hoàn toàn không phù hợp ở đây. –

2

Chắc chắn nó có thể, nhưng tôi sợ bạn sẽ không quá hài lòng với câu trả lời của tôi:

printf("-.5", -0.5); 
+1

Điều đó sẽ tạo ra một cảnh báo, vì không có thông số định dạng trong chuỗi "-.5" :). Tôi đánh giá cao một trò đùa, nhưng câu trả lời có thể là một Wiki cộng đồng. –

+0

Alexander: đã đồng ý –

0

Yes. Sử dụng sự xác định định dạng %g thay vì %f, tức là printf("%g", -0.5);

Nếu bạn không hài lòng với cách %g in một số con số trong ký hiệu hàm mũ, giải pháp thay thế là sử dụng snprintf để viết thư cho một bộ đệm chuỗi tạm thời, và sau đó đếm số của số không ở cuối trước khi viết nó ra với printf("%.*s", num_nonzero_places, tmp);, hoặc bạn chỉ có thể loại bỏ các số không và sử dụng fputs.

Bây giờ, tôi nhận ra câu hỏi là loại bỏ số 0 đứng đầu, không phải là số 0. Trong trường hợp này, cách tốt nhất tôi biết là sử dụng snprintf để ghi vào một chuỗi tạm thời, sau đó bỏ qua ký tự đầu tiên khi viết nó ra nếu ký tự đó là '0'. Bạn cũng sẽ cần phải thay thế dấu '-' nếu giá trị là số âm. Một cách để làm điều này:

snprintf(tmp, sizeof tmp, "%+f", val); 
printf("%.*s%s", tmp[0]=='-', tmp, tmp+1+(tmp[1]=='0')); 
+0

Sai. '% g' được chỉ định là'% f' hoặc '% e' tùy thuộc vào giá trị được in và cả hai giá trị được chỉ định để có chữ số ở phía trước dấu thập phân. Một thử nghiệm nhanh chóng xác nhận điều này: 'printf ("% g ", -0.5);' yields "-0.5" trên máy tính của tôi (Linux). – DevSolar

+0

Tệ của tôi. Tôi đã đọc nó như là một yêu cầu để loại bỏ các số không theo sau, không phải là số 0 đứng đầu. –

+0

Các chỉnh sửa mới phải cung cấp một cách tiếp cận đơn giản và chính xác. –

0

Chuyển đổi đôi hoặc nổi lên một char thì:

while (*yourChar != '\0') { 
    if (yourDoubleBeforeConversion > 1.0 && yourDoubleBeforeConversion < -1.0) { 
     continue; 
    } 
    if(*yourChar == '.') { 
     yourChar--; 
     *yourChar = ''; 
    } 
    else { 
    } 
} 

explination:

  1. trong khi vòng lặp xác định khi nào char kết thúc.
  2. Nếu gấp đôi bạn có lớn hơn 1 thì không có điểm nào trong trang trí.
  3. Nếu không tiếp tục kiểm tra ".".
  4. Khi tìm thấy trước, hãy xóa số 0.
Các vấn đề liên quan