, ovvero può printf
essere detto di ignorare zero quando precede il punto decimale?Can printf() produce "-.5" per il valore (-0.5)?
risposta
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
oe
[...]
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);
In una parola: No ...
printf() non posso, ma possiamo! –
Sì 'printf' possibile. Vedi la mia risposta. –
@R ..: No, non può. Vedi il mio commento per la tua risposta. – DevSolar
Vedere il printf spec, e la sezione di precisione. Si può fare printf("%+0.4f", -0.5);
scusa non ha funzionato – sharkin
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 per essere uno stronzo completo nel commento; è incallito per un completamente inopportuno qui. –
Certo che può, ma temo che non sarà troppo felice con la mia risposta:
printf("-.5", -0.5);
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. –
Alexander: concordato –
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'));
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
Il mio male. Stavo leggendolo come una richiesta per rimuovere gli zeri finali, non lo zero iniziale. –
Le nuove modifiche dovrebbero fornire un approccio semplice e corretto. –
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:
- ciclo while determina quando il char finisce.
- Se il doppio che hai avuto è maggiore di 1, non c'è alcun punto nel taglio.
- Se non si continua a cercare un ".".
- Quando viene trovato, andare prima ed eliminare lo zero.
- 1. Can Sweave produce molti file pdf automaticamente?
- 2. Imposta il valore printf() in una variabile PHP
- 3. printf e long double
- 4. È un difetto centrare una simulazione in [0.5, 0.5, 0.5] con una dimensione di casella di 1?
- 5. Can queue: pop restituisce un valore ora?
- 6. formattazione utilizzando printf e il formato
- 7. printf per size_t
- 8. posizione CALayer contiene NaN: [nan -0.5]
- 9. iOS 8 diverso comportamento: Autolayout con view.transform = CGAffineTransformMakeScale (0.5, 0.5), vista non è posizionato correttamente
- 10. MinGW non produce avvisi
- 11. ricorsiva creazione di directory per Node.js 0.5.x
- 12. Perché non scriviamo int x = printf ("testo"); poiché l'istruzione printf() restituisce un valore intero ogni volta?
- 13. Normalizzazione da [0.5 - 1] a [0 - 1]
- 14. OpenXml Can pacchetto non apre perché FileMode o FileAccess valore non è valido per il flusso
- 15. Per ciclo con printf come terzo argomento
- 16. ReactJS routing/sincronizzazione del browser reload on/percorso produce Can not Get/Path error
- 17. gotoxy() per Linux utilizzando printf
- 18. Il sub-specificatore in printf
- 19. canvas.toDataURL produce un'immagine nera piena?
- 20. Perché sprintf() non produce nulla?
- 21. printf in GLSL?
- 22. Can scala.util.Random.nextInt(): Int occasionalmente restituisce un valore negativo?
- 23. MySQL MAX (id) chiamato da PHP produce un valore strano
- 24. Utilizzo di più JOIN. SUM() che produce un valore errato
- 25. Stampa costante del valore esponenziale utilizzando printf in c
- 26. Can Mysql Dividere una colonna?
- 27. Perché python max ('a', 5) restituisce il valore stringa?
- 28. Punti sequenza in printf
- 29. Entity Framework 5 DbUpdateException: valore NULL per non annullabile membro
- 30. Activeadmin can can errore di autorizzazione
In che lingua? – halfdan
@halfdan sei a conoscenza di ... in che modo? :) – Habbie
@halfdan, pensavo che la maggior parte dei linguaggi che implementano printf semplicemente lo passino a libc ..? – Amadan