004#美化多位數字

將給定的數字以逗號分隔的形式顯示出來

代碼:

#!/bin/bash
# FILENAME: nicenum.sh
# 可接受兩個選項:DD(decimal pointa,小數分隔符)
# 和TD(thousands delimiter,千位分隔符)
#

niceNumber()
{
  # 檢測輸入數字的小數分隔符是否與用戶請求的相同
  sep="$(echo $1 | sed 's/[[:digit:]]//g')"
  echo $sep
  if [ ! -z "$sep" -a "$sep" != "$DD" ]; then
    echo "$0: Unknown decimal separator $sep encountered." >&2
    exit 1
  fi
  # 默認以"."爲小數分隔符
  # 可通過-d指定其他小數分隔符
  # 取出整數部分,即小數分隔符左側數字
  int=$(echo $1 | cut "-d$DD" -f1)
  # 取出小數部分
  decimal=$(echo $1 | cut "-d$DD" -f2)
  # 檢查輸入數字是否包含小數,有則保存
  if [ "$decimal" != "$1" ]; then
  # 保存小數到result
    result="${DD:='.'}$decimal"
  fi
  thousands=$int
  while [ $thousands -gt 999 ]; do
    # 對整數進行求餘,以判斷3個最低有效數字
    remainder=$(($thousands%1000))
    while [ ${#remainder} -lt 3 ]; do
      # 加入前導數字0
      remainder="0$remainder"
    done
    # 從右到左構建最終結果
    result="${TD:=','}${remainder}$result"
    # 對1000求商,移除3個最低有效數字
    thousands=$((thousands/1000))
  done
  nicenum="${thousands}${result}"
  if [ ! -z $2 ]; then
    echo $nicenum
  fi
}
  DD="."
  TD=","

  # main
  # 解析傳入參數 d,t
  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] numeric_value"
    echo " -d specifies the decimal point delimiter (default '.')"
    echo " -t specifies the thousands delimiter (default ',')"
    exit 0
  fi
  # 第二個參數強制nicenumber函數回顯輸出
  niceNumber $1 1
  exit 0

 

基本思路:

1、找出整數部分和小數部分
2、小數部分加上小數分隔符並保存待用
3、對大於1000的整數進行求餘得出最低3個位數,注意餘數不足3位需補0
4、再將大於1000的整數除於1000移除3個最低位有效數字
5、循環3-4步得出美化數字
6、可通過getopts自定義小數分隔符和千位分隔符
View Code

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章