2017-02-13 2 views
1

Я работаю над скриптом bash и хочу преобразовать одно значение ввода, которое всегда является целым, в научную нотацию. Когда я использую printf «% E», например, значение 300 будет преобразовано в 3.00E + 02. В принципе это имеет смысл, но мне нужен специальный формат 0.300E + 03. Я не нашел способа справиться с этим. Спасибо за помощь.определить формат printf «% E»

рассматривает Хельге

ответ

0

Один грубый способ, просто начать ... предупреждение: это работает только для примера, с мантиссы и показателем положительной:

#!/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" 

Запуск сценария Это дает :

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

От man 3 printf, курсив мой:

e, E Двойной аргумент округляется и преобразуется в стиле [-]d.ddde±dd где есть одна цифра перед символом десятичной точки и количеством цифр после нее равна точности; если точность отсутствует, она принимается равной 6; если точность равна нулю, символ десятичной точки не появляется. Преобразование E использует букву E (а не e), чтобы ввести показатель степени. Показатель всегда содержит не менее двух цифр; если значение равно нулю, показатель равен 00.

Если вы хотите мантиссы от 0 до 1, вам нужно будет создать собственный форматировщик. Вот пример в awk. Ручки 0 и негативы:

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; 
    }' 
} 

Используйте как:

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

благодарит за ответы. в принципе работает, но когда у меня есть число, подобное 3180, рассматривается только первое поле числа, 3, а не остальное начальное число. Я попытаюсь выяснить ту часть кода, где определено количество полей.

рассматривает Хельге

+0

Я попробовал мой ответ с 3180, и он работает почти разумно. Ваш ответ выше здесь должен быть опубликован как комментарий, а не как ответ. – linuxfan

Смежные вопросы