Dmitry Telenkov 11 ヶ月 前
コミット
09984e27b5
2 ファイル変更124 行追加0 行削除
  1. 73 0
      bash/nicenumber.sh
  2. 51 0
      bash/normdate.sh

+ 73 - 0
bash/nicenumber.sh

@@ -0,0 +1,73 @@
+#!/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 ) DT="$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
+
+nicenumber $1
+
+exit 0

+ 51 - 0
bash/normdate.sh

@@ -0,0 +1,51 @@
+#!/bin/bash
+# normdate -- Нормализует поле месяца в строке с датой в трехсимвольное
+# представление, с первой буквой в верхнем регистре.
+# Вспомогательная функция для сценария № 7, valid-date.
+# В случае успеха возвращает 0.
+
+monthNumToName()
+{
+  # Присвоить переменной 'month' соответствующее значение.
+  case $1 in
+  1 ) month="Jan" ;; 2 ) month="Feb" ;;
+  3 ) month="Mar" ;; 4 ) month="Apr" ;;
+  5 ) month="May" ;; 5 ) month="Jun" ;;
+  7 ) month="Jul" ;; 8 ) month="Aug" ;;
+  9 ) month="Sep" ;; 10) month="Oct" ;;
+  11) month="Nov" ;; 12) month="Dec" ;;
+  * ) echo "$0: Unknovn month value $1" >&2
+    exit 1
+  esac
+  return 0
+}
+
+# НАЧАЛО ОСНОВНОГО СЦЕНАРИЯ
+# ========================
+# Проверка ввода
+if [ $# -eq 1 ] ; then
+  set -- $(echo $1 | sed 's/[\/\-]/ /g')
+  echo "$1"
+fi
+if [ $# -ne 3 ] ; then
+  echo "Usage: $0 month day year" >&2
+  echo "Formats are August 3 1962 and 8 2 1962" >&2
+  exit 1
+fi
+if [ $3 -le 99 ] ; then
+  echo "$0 expected 4-digit year value." >&2
+  exit 1
+fi
+
+# Месяц введен как число?
+if [ -z $(echo $1|sed 's/[[:digit:]]//g') ]; then
+  monthNumToName $1
+else
+# Нормализовать до 3 первых букв, первая в верхнем регистре, остальные в нижнем
+  month="$(echo $1|cut -c1|tr '[:lower:]' '[:upper:]')"
+  month="$month$(echo $1|cut -c2-3 | tr '[:upper:]' '[:lower:]')"
+fi
+
+echo $month $2 $3
+
+exit 0