也是awk 和 bash 函數, 格式數字

也是awk 和 bash 函數, 格式數字

這兩個函數用來格式數字, 12345 ---> 12,345 -12345 ---> -12,345  23456.78 ----> 23,456.78
bash 的不必要的,Linux 下可以用 printf "%'d\n" 12345 , printf "%'f\n" 12345.67 , printf "%'g\n" .....等,
cygwin 的printf 就不成, 那就要用這函數充當一下  

awk version
复制内容到剪贴板
代码:
function commas(x,    y, z,  j, len, flag, out){  #設定參數
               
              if (x ~ /^-/) {   # 測試是否負數, 如果是,不要 `-' , 放入變量            
                    x=substr(x, 2)
                    j="-"
                  }
              if (match(x, /\./)) {  # 測試是否浮點數,如是
                    flag="float"        # 設定標誌
                    y=substr(x, RSTART)  # 分離浮點數放入變量,利用 match 函數反回的起始位置,內置變量RSTART
                    z=substr(x, 1, RSTART - 1) # 整數部分
                    x=z   # 變量改寫
                   }
                   else {
                       flag="int"
                   }
               len=length(x)  # 字符長度
               
               while ( len > 3 ){   # 設定巡環條建,因每三個數字加入一個 `,' , 小于3退出
                    len -= 3       # 減3 ,由最後的三個數字加入 `,'
                    x=substr(x, 1, len)","substr(x, len + 1)   # 改寫變數 x , 此表示式如數字是 1234567, 第一次循環會是 1234,567
                   }                                                        # 下一次是 1,234,567 , substr(x, len + 1) 返回 `,' 的所有字符,
                                                                             # 包含上次的巡環 x 的植           
               if ( flag == "int" ){ # 測試是否整數
                       out=x
                   }
                   else {
                       out=x y   # 浮點數我們加入點數部分
                   }
               if ( j == "-" ) out=j out  測試是否負數,如是,加入 `-' 在前面
           return out  # 返回結果
    }
這是 bash 版本,方式一樣,只係分離負數,浮點數用回 bash 的內建擴展,就不寫解釋了
复制内容到剪贴板
代码:
commas ()
{
    local i x y z len flag out;
    x=$1;
    if [[ $x =~ ^- ]]; then
        x=${x:1};
        i="-";
    fi;
    if [[ $x =~ \. ]]; then
        flag=float;
        y=".${x##*.}";
        z=${x%%.*};
        x=$z;
    else
        flag=int;
    fi;
    len=${#x};
    while (( len > 3 )); do
        (( len -= 3 ));
        x="${x:0:len},${x:len}";
    done;
    if [ "$flag" = "int" ]; then
        out=$x;
    else
        out="$x$y";
    fi;
    if [ "$i" = "-" ]; then
        out="$i$out";
    fi;
    echo "$out";
    return 0
}
      
journalist
執行的畫面
复制内容到剪贴板
代码:
$ cat bin/commas.awk
#! /bin/gawk -f

  function commas(x,    y, z, j, len, flag, out){
               
              if (x ~ /^-/) {
                    x=substr(x, 2)
                    j="-"
                  }
              if (match(x, /\./)) {
                    flag="float"
                    y=substr(x, RSTART)
                    z=substr(x, 1, RSTART - 1)
                    x=z
                   }
                   else {
                       flag="int"
                   }
               len=length(x)
               
               while ( len > 3 ){
                    len -= 3
                    x=substr(x, 1, len)","substr(x, len + 1)           
                   }
               
               if ( flag == "int" ){
                       out=x
                   }
                   else {
                       out=x y
                   }
               if ( j == "-" ) out=j out
           return out
    }
  {
    print commas($0)
  }
  


fang@bash ~
$ echo 12345 | commas.awk
12,345

fang@bash ~
$ echo 12345.57 | commas.awk
12,345.57

fang@bash ~
$ echo 112345.57 | commas.awk
112,345.57

fang@bash ~
$ echo -112345.57 | commas.awk
-112,345.57

fang@bash ~
$
在 awk 不必掉用 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta 或 bash 了       
journalist
不错的样子, 赞一个      
向twf_cc学习.      
引用:
原帖由 TUDOU01 于 2008-3-27 17:08 发表
向twf_cc学习.
謝謝, 互相學習         
journalist
楼主使用cygwin ?
推荐一个andlinux
在windows下装来玩玩      
是的,現在用Cygwin 多一點,因Linux 沒有股市即時報價軟件,沒辦法
Cygwin 我沒裝 X 的        
journalist
总体感觉 cygwin 还是比较慢的      
是的,但90% 跟 linux 一樣, 還可調用 windows 的命令,      
journalist
andlinux是在windows上运行了一个ubuntu linux
通过Xming来显示linux的GUI程序, 通过smb与windows共享(当然可可以有其它方式)
我一般只打开terminal窗口

cygwin提供的程序太有限了
而andlinux是一个完整的linux os(姑且这么说吧)
加上apt强大方便的在线安装软件方式
值得推荐
(好像我在搞推销了...)