Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Stampare numeri col C

6 views
Skip to first unread message

Yoda

unread,
Apr 14, 2015, 6:26:38 PM4/14/15
to
Un saluto a tutti! (tutti... i Fantasmi? ;^))

Un grazie in anticipo se un'anima pia mi dice il codice per printf per il
seguente mio problema in C (non ++).

Nella variabile n_cifre ho il numero 5565708.94... (notazione americana).
Se metto nel sorgente:
printf("cifre esatte fattoriale: %.lf\n",n_cifre);

mi da': 5565709, e mi sta benissimo l'arrotondamente (che spero sia
sempre per eccesso, altrimenti sbaglia di 1).

La mia domanda e' la seguente.
1) Come posso ottenere questo: 5.565.709 ?
2) Come posso invece ottenere eventualmente quest'altro: 5.565.708,94 ?


Ps. Nella manpagina di printf c'e' che la notazione 2) e' del locale della
Danimarca (che poi e' lo stesso nostro), ma non dice come attivarlo :-(

--
Tanti saluti

GIulia

unread,
Apr 14, 2015, 6:37:52 PM4/14/15
to
Yoda ha scritto:
prova questo

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

int main(void)
{
assert(setlocale(LC_NUMERIC, ""));

/* This works. */
printf("%1$d %1$d\n", 1000);

/* This does not, even if LC_NUMERIC is C. */
printf("%'d\n", 1001);

return 0;
}

Yoda

unread,
Apr 15, 2015, 3:58:30 AM4/15/15
to
Addi' 14 apr 2015, GIulia scrive:
> Yoda ha scritto:


>> mi da': 5565709, e mi sta benissimo l'arrotondamente (che spero sia
>> sempre per eccesso, altrimenti sbaglia di 1).

Si' e' sempre per eccesso, ho visto man ceil.

>> La mia domanda e' la seguente.
>> 1) Come posso ottenere questo: 5.565.709 ?
>> 2) Come posso invece ottenere eventualmente quest'altro: 5.565.708,94 ?

> prova questo
> #include <locale.h>
> assert(setlocale(LC_NUMERIC, ""));
[............]

Perfetto! ho messo solo la direttiva #include <locale.h> e l'istruzione
setlocale(LC_ALL,""), ho visto le manpagine.

Grazie di nuovo Giulia

--
Tanti saluti

Giovanni

unread,
Apr 15, 2015, 3:59:01 AM4/15/15
to
La man page di printf della mia distribuzione riporta:
printf("%'.2lf\n", 1234567.89);
Con questa stringa di formato io ottengo:
1,234,567.89.
Dato che io ho settato il locale 'en_US' dovrebbe corrispondere
esattamente a quello che tu chiedi se setti il locale 'it_IT'.

Il carattere apice '\'' forza il raggruppamento delle migliaia in
accordo con le specifiche del locale.

Il carattere punto '.' seguito da un numero (2 nell'esempio) stabilisce
la grandezza del campo dei decimali.

Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
< http://giovanni.homelinux.net/ >

Yoda

unread,
Apr 15, 2015, 4:59:44 AM4/15/15
to
Addi' 15 apr 2015, Giovanni scrive:
Si' e grazie, le astuzie dell'apice e del punto me le ricordavo, era il
comando-istruzione setlocale che ci avrei messo molto per trovarlo. Io
con la Debian ho it_IT in tutta la macchina... e apropos: parecchi anni
fa la Debian lasciava root fuori del locale (manpagine e messaggi stderr
tutti in inglese, adesso invece no; sai mica come si puo' fare per avere
in inglese US solo root?

--
Tanti saluti

Giovanni

unread,
Apr 15, 2015, 8:53:19 AM4/15/15
to
On 04/15/2015 10:59 AM, Yoda wrote:

> Io con la Debian ho it_IT in tutta la macchina... e apropos: parecchi
> anni fa la Debian lasciava root fuori del locale (manpagine e
> messaggi stderr tutti in inglese, adesso invece no; sai mica come si
> puo' fare per avere in inglese US solo root?

Nelle Slackware la lingua di default è settata con il comando
export LANG=en_US
che viene eseguito al login richiamando il file /etc/profile.d/lang.sh

Puoi provare ad aggiungere la direttiva nel file ~/.bashrc della $HOME
di root oppure ricercare dove viene inizializzata la variabile $LANG e
sostituirla con:

if [ "$(id -u)" = "0" ]; then
export LANG=en_US ## login di root
else
export LANG=it_IT ## altre login
fi
0 new messages