這兩個函數用來格式數字, 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
}