2015-06-15 9 views
5

एक साधारण समस्या है लेकिन मुझे इस तरह के प्रारूप के बारे में दस्तावेज़ीकरण नहीं मिल रहा है: मैं फोरट्रान वैज्ञानिक नोटेशन में एक फ्लोट मुद्रित करना चाहता हूं, इसके पूर्णांक भाग हमेशा शून्य होने के साथ।कोई भी पूर्णांक भाग के साथ वैज्ञानिक प्रारूप में दोहराएं

printf("%0.5E",data); // Gives 2.74600E+02 

मैं इस तरह यह प्रिंट करना चाहते हैं:

.27460E+03 

मैं कैसे संभव के रूप में स्वच्छ के रूप में इस परिणाम मिल सकता है?

+2

मुझे इसे पुराने किले के निष्पादन योग्य – avances123

+2

पर फ़ीड करने की आवश्यकता है टेक्स्ट मैनिपुलेशन जाने का तरीका प्रतीत होता है। आप लाइब्रेरी की खोज कर सकते हैं, लेकिन मेरा अनुमान है कि कोई भी इस तरह के अजीब प्रारूप का समर्थन नहीं करता है। –

+4

https://www.google.com/search?q=c%2B%2B+print+fortran+format –

उत्तर

1

मैंने log10() और pow() के साथ ऐसा करने का प्रयास किया, लेकिन गोल त्रुटियों के साथ समस्याएं समाप्त हुईं। तो @Karoly Horvath द्वारा टिप्पणी की गई, स्ट्रिंग मैनिपुलेशन शायद सबसे अच्छा तरीका है।

#include <stdlib.h> 

char *fortran_sprintf_double(double x, int ndigits) { 
    char format[30], *p; 
    static char output[30]; 

    /* Create format string (constrain number of digits to range 1–15) */ 
    if (ndigits > 15) ndigits = 15; 
    if (ndigits < 1) ndigits = 1; 
    sprintf(format, "%%#.%dE", ndigits-1); 

    /* Convert number to exponential format (multiply by 10) */ 
    sprintf(output, format, x * 10.0); 

    /* Move the decimal point one place to the left (divide by 10) */ 
    for (p=output+1; *p; p++) { 
    if (*p=='.') { 
     *p = p[-1]; 
     p[-1] = '.'; 
     break; 
    } 
    } 

    return output; 
} 
1

आप केवल पूर्णांक भाग 0 और नहीं किया जा रहा बारे में परवाह है, तो वास्तव में, 0 बाहर छोड़ने यानी अगर आप .27460E+03 आप इस के लिए इसी तरह कुछ कर सकते हैं के बजाय 0.27460E+03 के साथ ठीक कर रहे हैं:

#include <stdio.h> 
#include <stdlib.h> 

void fortran_printf(); 

int main(void) 
{ 
     double num = 274.600; 
     fortran_printf(num); 

     exit(EXIT_SUCCESS); 
} 

void fortran_printf(double num) 
{ 
     int num_e = 0; 
     while (num > 1.0) { 
       num /= 10; 
       num_e++; 
     } 

     printf("%.5fE+%02d", num, num_e); 
} 

अन्यथा आपको तारों पर एक चक्कर लगाना होगा। ध्यान दें कि ऊपर दिया गया कोड केवल आपको शुरू करने के लिए है। यह निश्चित रूप से किसी भी शामिल मामलों को संभाल नहीं करता है।

1

एक स्ट्रिंग हेरफेर दृष्टिकोण:

int printf_NoIntegerPart(double x, int prec) { 
    char buf[20 + prec]; 
    sprintf(buf, "%+.*E", prec - 1, x * 10.0); // use + for consistent width output 
    if (buf[2] == '.') { 
    buf[2] = buf[1]; 
    buf[1] = '.'; 
    } 
    puts(buf); 
} 

int main(void) { 
    printf_NoIntegerPart(2.74600E+02, 5); // --> +.27460E+03 
} 

इस के लिए |x| > DBL_MAX/10

1

printf() "INF" प्रिंट एक कदम में ओ पी के लक्ष्य को पूरा नहीं करेगा कुछ विशेष प्रारूप का उपयोग होगा। प्रारंभिक पाठ परिणाम बनाने के लिए sprintf() का उपयोग करना एक अच्छा पहला कदम है, स्ट्रिंग मैनिपुलेशन के साथ "गणित" करने का प्रयास करते समय देखभाल का उपयोग किया जाना चाहिए।

Akin से @user3121023 हटाया गया उत्तर।

#include <assert.h> 
#include <stdlib.h> 
#include <stdio.h> 

int printf_NoIntegerPart(double x, int prec) { 
    assert(prec >= 2 && prec <= 100); 
    char buffer[prec + 16]; // Form a large enough buffer. 
    sprintf(buffer, "%.*E", prec - 1, x); 

    int dp = '.'; // Could expand code here to get current local's decimal point. 
    char *dp_ptr = strchr(buffer, dp); 
    char *E_ptr = strchr(buffer, 'E'); 
    // Insure we are not dealing with infinity, Nan, just the expected format. 
    if (dp_ptr && dp_ptr > buffer && E_ptr) { 
    // Swap dp and leading digit 
    dp_ptr[0] = dp_ptr[-1]; 
    dp_ptr[-1] = dp; 
    // If x was not zero … 
    if (x != 0) { 
     int expo = atoi(&E_ptr[1]); // Could use `strtol()` 
     sprintf(&E_ptr[1], "%+.02d", expo + 1); 
    } 
    } 
    return puts(buffer); 
} 

int main(void) { 
    printf_NoIntegerPart(2.74600E+02, 5); // ".27460E+03" 
    return 0; 
} 
संबंधित मुद्दे