您的位置:首页 > 其它

第一章:The Missing Code Library--6.合法化浮点数输入

2012-12-06 10:49 495 查看
咋一看,在一个shell脚本中合法化一个浮点值的过程看起来有些挫,但想想看浮点数也不过就是一个用小数点分割开来的2个整数。联系第5个脚本validint.sh,你会发现浮点数合法化的测试短的让人惊讶。

代码:

validfloatNew.sh

#!/bin/sh

source validint.sh

validfloat()
{
fvalue="$1"
delimiter="$(echo $fvalue | sed 's/[^e|^E]//g')"

if [ ! -z $delimiter ]; then    #测试下是否有e或E

if [ ${#delimiter} -ne 1 ]; then    #e或E不能有多个
echo "only one e or E."
return 1
fi

decimalPart="$(echo $fvalue | cut -d. -f1)"                #小数点前部分
part="$(echo $fvalue | cut -d. -f2-)"                    #小数点后部分,注意f2后有一小横,目的是输出剩下的所有域
fractionalPart="$(echo $part | cut "-d$delimiter" -f1)"    #小数点后,e前部分
exponent="$(echo $part | cut "-d$delimiter" -f2)"        #e后部分

if ! validint "$decimalPart" "-9" "9"; then                #测试小数点前的部分是不是一个数字,即0-9范围内
echo "scientific notation's decimal part abs must in [0-9]."
return 1
fi

if [ "${fractionalPart%${fractionalPart#?}}" = '-' ]; then    #测试小数部分第一个符号是不是负号
echo "scientific notation's fractional portion cannot be negative."
return 1
fi

if [ "$fractionalPart" = "" ]; then    #测试小数部分是不是为空
echo "scientific notation's fractional portion is empty."
return 1
else
if ! validint "$fractionalPart" "" ""; then        #测试小数部分是不是整数
echo "scientific notation's fractional portion is not integer."
return 1
fi
fi

if ! validint "$exponent" "" ""; then
echo "scientific notation's exponent not integer."
return 1
fi

elif [ ! -z $(echo $fvalue | sed 's/[^.]//g') ]; then

decimalPart="$(echo $fvalue | cut -d. -f1)"
fractionalPart="$(echo $fvalue | cut -d. -f2)"

if [ ! -z $decimalPart ]; then
if ! validint "$decimalPart" "" ""; then
return 1
fi
fi

if [ "${fractionalPart%${fractionalPart#?}}" = "-" ]; then
echo "Invalid floating-point number: '-' not allowed \
after decimal point" >&2
return 1
fi

if [ "$fractionalPart" != "" ]; then
if ! validint "$fractionalPart" "0" ""; then
return 1
fi
fi

if [ "$decimalPart" = "-" -o -z "$decimalPart" ]; then
if [ -z $fractionalPart ]; then
echo "Invalid floating-point format." >&2
fi
fi

else
if [ "$fvalue" = "-" ]; then
echo "Invalid floating-point format." >&2
return 1
fi

if ! validint "$fvalue" "" ""; then
return 1
fi

fi

return 0
}

if validfloat $1; then
echo "$1 is a valid floating-point value"
fi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: