2012-11-29 15 views
6

Come devo prendere un numero che è in centinaia di secondi e visualizzarlo in secondi a due cifre decimali? Il codice Psuedo per seguire la funzione dTime di cui non sono sicuro, ma a mio avviso otterrà quello che sto puntando.Come visualizzare il numero a due posizioni decimali nella funzione bash

function time { 
    echo "$(date +%N)/10000000" 
} 

function dTime { 
    echo "($1/100).(${$1:${#1}-3:${#1}-1})" 
} 

T=$time 
sleep 2 
T=$dTime T 
+0

bash esegue solo aritmetica intera. La tua domanda è in qualche modo fuorviante, come stai chiedendo di visualizzare un numero con due cifre decimali, e il codice che mostri mostra chiaramente l'aritmetica in virgola mobile. –

+0

Utilizzare [printf] [1] e piggyback su codice long-tested. [1]: http://stackoverflow.com/questions/4377871/sprintf-in-shell-scripting –

risposta

20

Bash ha una funzione printf costruito in:

printf "%0.2f\n" $T 
+1

Essere consapevoli che printf dipende dalle impostazioni locali! Ad esempio in Fr, ',' è usato in locale per la separazione float, non '.'. Quindi in Fr, printf "% 0.2f \ n" 26.600 restituirà un errore (il numero deve essere espresso come "26.600") – brunetton

4

seguito le divide l'uscita di date +%N da 1000000000, arrotonda il risultato a due cifre decimali e assegna il risultato alla variabile T.

printf -v T "%.2f" $(bc -l <<< "$(date +%N)/1000000000") 

Se si desidera solo per stampare la roba,

bc <<< "scale=2; $(date +%N)/1000000000" 

Se non ti piace bc e si desidera utilizzare dc (che è un po 'più leggero e molto più divertente da usare in quanto è polacca inversa),

dc <<< "2 k $(date +%N) 1000000000/p" 

notare la differenza, con printf avrete la leader 0, non con bc e dc. C'è un'altra differenza tra printf e bc (o dc): printf round al numero più vicino a due posizioni decimali, mentre bc (o dc) rounds correggere a due posizioni decimali. Se si desidera che quest'ultimo comportamento e di assegnare a una variabile T il risultato, è possibile utilizzare, ad esempio,

T=$(dc <<< "2 k $(date +%N) 1000000000/p") 

o, se si vuole anche il principale 0:

T=0.$(dc <<< "2 k $(date +%N) 1000000000/p") 
Problemi correlati