#!/bin/sh
# nicenumber -- tant donn un nombre, l'affiche sous forme lisible,
#   en sparant les groupes de trois chiffres. Exige que les variables
#   DD et TD soient mises en place. Met en place la variable nicenum
#   ou affiche le rsultat sur la sortie standard stdout, en prsence
#   d'un second argument.

nicenumber()
{
  # On suppose que '.' est le sparateur dcimal dans la valeur d'entre
  # du script. Le sparateur dcimal de la valeur produite sera '.' sauf
  # si l'utilisateur en prcise un autre avec l'option -d.

  integer=$(echo $1 | cut -d. -f1)     # partie entire
  decimal=$(echo $1 | cut -d. -f2)     # partie fractionnaire

  if [ $decimal != $1 ]; then
    # Prsence d'une partie fractionnaire; incluons-la.
    result="${DD:="."}$decimal"
  fi

  thousands=$integer

  while [ $thousands -gt 999 ]; do
    remainder=$(($thousands % 1000))   # trois chiffres de droite

    while [ ${#remainder} -lt 3 ] ; do # met en place des zros initiaux
      remainder="0$remainder"
    done

    thousands=$(($thousands / 1000))   # on passe au bloc suivant, s'il existe
    result="${TD:=","}${remainder}${result}" # construction de droite  gauche
  done

  nicenum="${thousands}${result}"
  if [ ! -z $2 ] ; then
    echo $nicenum
  fi
}

DD="."  # sparateur dcimal, entre les parties entire et fractionnaire
TD=","  # sparateur des groupes de milliers, appliqu tous les trois chiffres

while getopts "d:t:" opt; do
  case $opt in
    d ) DD="$OPTARGS"     ;;
    t ) TD="$OPTARGS"     ;;
  esac
done
shift $((OPTIND-1))

if [ $# -eq 0 ] ; then 
  echo "Syntaxe: $(basename $0) [-d c] [-t c] valeur numrique" 
  echo "  -d spcifie le sparateur dcimal (par dfaut: '.')" 
  echo "  -t spcifie le sparateur des milliers (par dfaut: ',')" 
  exit 0
fi

nicenumber $1 1  # le deuxime argument impose  nicenumber 
                 # d'afficher la sortie avec 'echo'

exit 0
