zoukankan      html  css  js  c++  java
  • 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
    *** 你必须十分努力,才能看起来毫不费力 ***
  • 相关阅读:
    bzoj1093【ZJOI2007】最大半联通子图
    bzoj3609【HEOI2014】人人尽说江南好
    Codeforces Round #381 Div.2
    bzoj3405:[Usaco2009 Open]Grazing2 移动牛棚
    bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班
    bzoj3315:[Usaco2013 Nov]Pogo-Cow
    bzoj1018:[SHOI2008]堵塞的交通traffic
    bzoj4637:期望
    二次剩余
    Very Long Suffix Array
  • 原文地址:https://www.cnblogs.com/bigtree2pingping/p/12938373.html
Copyright © 2011-2022 走看看