定义printf的格式"%E"

时间:2017-02-13 17:48:12

标签: bash printf scientific-notation

我处理一个bash脚本,并希望将一个输入值(始终为整数)转换为科学记数法。 当我使用printf"%E"例如,300的值将转换为3.00E + 02。原则上有意义,但我需要特殊格式0.300E + 03。我没有找到办法管理它。 谢谢你的帮助。

问候 黑尔格

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

答案 2 :(得分:0)

感谢您的回答。 原则上它是有效的,但是当我有一个像3180这样的数字时,只考虑数字的第一个字段,即3,而不是初始数字的其余部分。我将尝试找出定义字段数的代码部分。

问候 黑尔格