2017-02-13 1 views
1

Je travaille sur un script bash et je veux convertir une valeur d'entrée, qui est toujours un entier, en notation scientifique. Lorsque j'utilise printf "% E" par exemple, la valeur de 300 serait convertie en 3.00E + 02. En principe cela a du sens mais j'ai besoin du format spécial 0.300E + 03. Je n'ai pas trouvé de moyen de gérer ça. Merci pour votre aide.définir le format de printf "% E"

concernant Helge

Répondre

0

Une façon grossière, juste pour commencer ... avertissement: cela fonctionne pour votre exemple, avec mantisse et exposant positif:

#!/bin/sh 

theval=$(printf "%4.2E" "$1") # 200 -> 2.00E+02 
# we want 0. 20 E+03 

mantissa=${theval%E*} 
echo "mantissa1=$mantissa" # 2.00 
mantissa="0.${mantissa:0:1}${mantissa:2:1}" 
echo "mantissa2=$mantissa" 

exp=${theval#*+} 
let exp=exp+1 
exp=$(printf "%2.2d" $exp) 

echo "Result=${mantissa}E+$exp" 

L'exécution de cette donne de script :

/tmp$ ./exp.sh 200 
mantissa1=2.00 
mantissa2=0.20 
Result=0.20E+03 
0

de man 3 printf, Souligné par l'auteur:

e, E Le double argument est arrondi, et dans le style [-]d.ddde±ddil y a un chiffre avant le caractère décimal point et le nombre de chiffres après il est égal à la précision; si la précision est manquante, elle est prise comme 6; si la précision est zéro, aucun caractère point décimal n'apparaît. Une conversion E utilise la lettre E (plutôt que e) pour introduire l'exposant. L'exposant contient toujours au moins deux chiffres; si la valeur est zéro, l'exposant est 00.

Si vous voulez que la mantisse soit entre 0 et 1, vous devrez créer votre propre formateur. Voici un exemple dans awk. Poignées 0 et négatifs:

function sn() { 
    awk -vn=$1 'BEGIN { 
    split(n,a,"E"); 
    if  (0 < a[1]) { m=a[1]/10; e=a[2]+1; p=length(a[1])-1; } 
    else if (a[1] < 0) { m=a[1]/10; e=a[2]+1; p=length(a[1])-2; } 
    else    { m=0; e=0; p=length(a[1])-2; } 
    printf "%0.*fE%+03d", p, m, e; 
    }' 
} 

utilisation comme:

sn $(printf "%4.2E" -0.024) 
0

Merci pour les réponses. en principe cela fonctionne, mais quand j'ai un nombre comme 3180, juste le premier champ du nombre, le 3, est considéré et pas le reste du nombre initial. Je vais essayer de trouver la partie du code où le nombre de champs est défini.

concernant Helge

+0

j'ai essayé ma réponse avec 3180, et il fonctionne presque raisonnablement. _Votre réponse ci-dessus aurait dû être affichée en tant que commentaire, pas en tant que réponse_. – linuxfan