2010-10-06 13 views

risposta

3

Con tutte le cose che sono specificati nella norma ISO C99, questo non è possibile. La documentazione per gli specifiers di conversione dice:

f, F: [...] Se viene visualizzato un carattere punto decimale, prima di esso viene visualizzata almeno una cifra. [...]

e, E: [...] c'è una cifra (che è diverso da zero se l'argomento è diverso da zero) prima del carattere decimale-punto [...]

g, G : [...] viene convertito in stile f o e [...]

Poiché gli altri indicatori di conversione non sarebbe stampare un numero in virgola mobile decimale, questo è impossibile a tutti. A meno che non trovi un'estensione fornitore che introduce un altro identificatore di conversione. Ma allora il tuo programma non sarebbe più valido C più.

La soluzione migliore che mi viene in mente è:

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

In una parola: No ...

+0

printf() non posso, ma possiamo! –

+0

Sì 'printf' possibile. Vedi la mia risposta. –

+0

@R ..: No, non può. Vedi il mio commento per la tua risposta. – DevSolar

-3

Vedere il printf spec, e la sezione di precisione. Si può fare printf("%+0.4f", -0.5);

+0

scusa non ha funzionato – sharkin

+2

Bene? Il testo al passaggio del mouse indica: "Questa risposta non è utile". Questo si applica poiché la tua risposta non risolve la domanda dell'OP. (Non * il mio * downvote, ma ancora - nessun motivo per essere personale.) – DevSolar

+1

-1 per essere uno stronzo completo nel commento; è incallito per un completamente inopportuno qui. –

2

Certo che può, ma temo che non sarà troppo felice con la mia risposta:

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

Questo produrrà un avvertimento, poiché non ci sono specifiche di formato nella stringa "-5" :). Apprezzo una battuta, ma la risposta dovrebbe probabilmente essere un wiki della community. –

+0

Alexander: concordato –

0

Sì. Utilizzare l'identificatore di formato %g invece di %f, cioè printf("%g", -0.5);

Se non sei soddisfatto del modo in cui %g stampe alcuni numeri in notazione esponenziale, l'alternativa è quella di utilizzare snprintf di scrivere in un buffer stringa temporanea, e poi contare il numero di zeri alla fine prima di scriverlo con printf("%.*s", num_nonzero_places, tmp);, oppure è sufficiente rimuovere gli zeri e utilizzare fputs.

Ora mi rendo conto che la domanda riguarda la rimozione dello zero iniziale, non degli zero finali. In questo caso, il modo migliore che conosco è usare snprintf per scrivere su una stringa temporanea, quindi saltare il primo carattere quando lo si scrive se quel carattere è '0'. Dovrai sostituire anche il segno '-' se il valore è negativo. Un modo per farlo:

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

Sbagliato. '% g' è specificato come'% f' o '% e' a seconda del valore da stampare, ed entrambi sono specificati per avere una cifra davanti al punto decimale. Un rapido test lo conferma: 'printf ("% g ", -0.5);' produce "-0.5" sulla mia macchina (Linux). – DevSolar

+0

Il mio male. Stavo leggendolo come una richiesta per rimuovere gli zeri finali, non lo zero iniziale. –

+0

Le nuove modifiche dovrebbero fornire un approccio semplice e corretto. –

0

Convertire il vostro letto matrimoniale o galleggiare per un char poi:

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

explination:

  1. ciclo while determina quando il char finisce.
  2. Se il doppio che hai avuto è maggiore di 1, non c'è alcun punto nel taglio.
  3. Se non si continua a cercare un ".".
  4. Quando viene trovato, andare prima ed eliminare lo zero.
Problemi correlati