#!/bin/sh
# validfloat -- Test pour savoir si un nombre est une valeur flottante correcte.
#   Attention! Ce script n'accepte pas la notation scientifique (1.304e5)

# Pour savoir si la valeur propose est un nombre flottant correct, il
# faut le couper au niveau du sparateur dcimal. On examine ensuite la
# premire partie pour savoir si c'est un entier valable, puis le deuxime
# membre pour savoir si c'est un entier positif ou nul valable.
# De cette manire, -30.5 sera accept, mais pas -30.-8

. validint # notation Bourne shell pour sourcer la fonction validint

validfloat() 
{ 
  fvalue="$1"

  if [ ! -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 "Nombre flottant invalide: '-' est interdit dans la partie fractionnaire" >&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 "Format de nombre flottant invalide." >&2 ; return 1
      fi
    fi

  else

    if [ "$fvalue" = "-" ] ; then
      echo "Format de nombre flottant invalide." >&2 ; return 1
    fi

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

  fi 

  return 0
}
