006#驗證浮點數輸入

基本思路:

1、檢查輸入值是否包含小數點"."

2、包含小數點則對小數點的整數部分和小數部分分開測試

3、確保小數點兩邊都是有效的整數,且沒有多餘的負號(針對validint進行補充判斷)

4、最後檢查是否輸入值只是一個負號和小數點

5、其他:待增強

注:本腳本不接受科學計數法:1.24e4

#!/usr/bin/env bash
#
# FILENAME: validfloat.sh
# 驗證浮點數輸入
#
# 整數判斷
validint(){
  number=$1
  min=$2
  max=$3

  # 空值檢測
  if [ -z $number ]; then
    echo "You didn't input anything." >&2
    return 1
  fi

  # 負數符號檢測
  if [ "${number%${number#?}}" = "-" ]; then
    num="${number#?}"
  else
    num="${number}"
  fi
  
  # 檢查除負數符號後的數字是否是整數
  nodigits=$(echo $num | sed 's/[[:digit:]]//g')
  if [ ! -z "$nodigits" ]; then
    echo "Invalid number format. Only digits, no commas, spaces, etc." >&2
    return 1
  fi

  # 判斷輸入值是否小於指定最小值
  if [ ! -z $min ]; then
    if [ $number -lt $min  ]; then
      echo "You value is too small. the smallest value is $min" >&2
      return 1
    fi
  fi

  # 判斷輸入值是否大於指定最大值
  if [ ! -z $max ]; then
    if [ $number -gt $max ]; then
      echo "You value is too big. the largest value is $max" >&2
      return 1
    fi
  fi

  return 0
}

# 浮點數判斷
validfloat(){
  fvalue="$1"
  # 檢查輸入的數字是否有小數點
  if [ ! -z $(echo $fvalue|sed 's/[^.]//g') ]; then
    integerPart="$(echo $fvalue|cut -d. -f1)" # 整數部分
    decimalPart="${fvalue#*.}"  # 小數部分
    
    # 判斷整數部分是否合法
    if [ ! -z $integerPart ]; then
      if ! validint "$integerPart" "" ""; then
        return 1
      fi
    fi

    # 判斷小數部分是否合法
    if [ "${decimalPart%${decimalPart#?}}" = "-" ]; then
      echo "Invalid float number: '-' not allowed after decimal point." >&2
      return 1
    fi

    if [ "${decimalPart}" != "" ]; then
      if ! validint "$decimalPart" "0" ""; then
        return 1
      fi
    fi
  else
    if [ "$fvalue" = "-" ]; then
      echo "Invalid float format. " >&2
      return 1
    fi
  
    if ! validint "$fvalue" "" ""; then
      return 1
    else
      echo "$1 is integer number."
      return 1
    fi
  fi
    return 0
}

# 驗證浮點數輸入
if [ $# -ne 1 ]; then 
  echo "Usage: $0 floating_Number." >&2
  exit 1
fi

if validfloat $1; then
  echo "$1 is a valid floating-point value."
fi
exit 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章