#!/bin/bash
# nicenumber -- Отображает переданное число в формате представления с запятыми.
# Предполагает наличие переменных DD (decimal point delimiter -- разделитель
# дробной части) и TD (thousands delimiter -- разделитель групп разрядов).
# Создает переменную nicenum с результатом, а при наличии второго аргумента
# дополнительно выводит результат в стандартный вывод.

nicenumber()
{
  # Обратите внимание: предполагается, что для разделения дробной и целой
  # части во входном значении используется точка.
  # В выходной строке в качестве такого разделителя используется точка, если
  # пользователь не определил другой сивол с помощью флага -d.
  integer=$(echo $1 | cut -d. -f1) # Слева от точки
  decimal=$(echo $1 | cut -d. -f2) # Справа от точки

  echo $integer
  echo $decimal

  # Проверить присутствие дробной части в числе.
  if [ "$decimal" != "$1" ]; then
    # Дробная часть есть, включить ее в результат.
    result="${DD:= '.'}$decimal"
  fi

  thousands=$integer

  while [ $thousands -gt 999 ]; do
    remainder=$(($thousands % 1000)) # Три последние значимые цифры

    # В 'remainder' должно быть три цифры. Требуется добавить ведущие нули?
    while [ ${#remainder} -lt 3 ] ; do # Добавить ведущие нули
      remainder="0$remainder"
    done

    result="${TS:=","}${remainder}${result}" # Конструировать справа налево
    thousands=$(($thousands / 1000)) # Оставить остаток, если есть
  done

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

DD="." # Десятичная точка для разделения целой и дробной части
TD="," # Разделитель групп разрядов

# Начало основного сценария
# ==================

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

# Проверка ввода
if [ $# -eq 0 ] ; then
  echo "Usage: $(basename $0) [-d c] [-t c] number"
  echo " -d specifies the decimal point delimiter"
  echo " -t specifies the thousands delimiter"
  exit 0
fi

nicenumber $1 1 # Второй аргумент заставляет nicenumber вывести результат.

exit 0
