验证数字,然后格式化为十进制

时间:2017-03-23 15:41:35

标签: bash awk decimal

发布编辑:

我的脚本中有一个功能,它不会像我想要的那样工作。 目标是验证数字,然后格式化为十进制。

所以我创建了一个看起来像我的函数的测试文件......

TMP_NUM="$1"
if [[ "$TMP_NUM" = *[[:digit:]]* ]]; then
    if [[ "$TMP_NUM" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then
        echo "$TMP_NUM"
    else
        TMP_DECIMAL=$(awk -v decimal="$TMP_NUM" 'BEGIN {printf("%f", decimal) }')
        if [[ "$TMP_DECIMAL" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then
            echo "$TMP_DECIMAL"
        else
            echo "failed !"
        fi
    fi
else
    echo "failed !"
fi
exit 0

结果......

mario@antec:~$ test.function4.sh 1e-06
0.000001
mario@antec:~$ test.function4.sh 1e-05
0.000010
mario@antec:~$ test.function4.sh 0Hallo
0.000000

我如何更改测试参数以仅获取格式化数字,并且当任何数字后面的任何字母后面都有错误消息,eE除外?

2 个答案:

答案 0 :(得分:3)

awk救援!

定义此功能

test_number() { awk -v v="$1" 'BEGIN{if(v+0==v) printf "%f\n",v; else print "failed!"}';}

使用

$ test_number XXX
failed!
$ test_number 2323
2323.000000
$ test_number 0.23234
0.232340
$ test_number 0.23234XX
failed!
$ test_number 0.23234E4
2323.400000

答案 1 :(得分:1)

您可以这样重写代码 - 在格式化之前检查数字:

#!/bin/bash
TMP_NUM="$1"
if [[ "$TMP_NUM" =~ ^[0-9]+([.][0-9]+)?$ ]]; then
  TMP_DECIMAL=$(awk -v decimal="$TMP_NUM" 'BEGIN {printf("%f", decimal) }')
  echo "$TMP_DECIMAL"
else
  echo "failed !"
fi

printf正在舍入您的号码。您可以更改格式字符串以指定要保留的小数位数。