2017-03-23 6 views
0

投稿編集:数字を検証して小数点以下をフォーマットする

私のスクリプトには、私が望むように機能しない機能があります。 目的は数値を検証し、10進数にフォーマットすることです。

だから私は、テスト・ファイルのthatsは私の機能のように見える作成...

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 

結果...私だけを取得するためのテストパラメータを変更しなければならないのはどのよう

[email protected]:~$ test.function4.sh 1e-06 
0.000001 
[email protected]:~$ test.function4.sh 1e-05 
0.000010 
[email protected]:~$ test.function4.sh 0Hallo 
0.000000 

数字が書式設定されていて、eE以外の文字が数字の後ろにある場合のエラーメッセージ?

答えて

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

おそらく関数に別の名前を使用しますか? 'test'はシェル組み込みを妨げる可能性があります。 – codeforester

+1

はい、良い点。名前が変更されました。 – karakfa

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はあなたの番号を丸めています。書式文字列を変更して、保持する小数の数を指定することができます。

+0

感謝を定義します。ポイントの後に数字を指定するために文字列をフォーマットするにはどうすればよいですか?残念ながら私はスクリプトを書き留めて、投稿を編集しなければなりませんでした。 – suleiman

関連する問題