Zsh

在 zsh 中舍入/截斷字元串中的數字(或使用外部工具)

  • August 7, 2013

我正在嘗試做一個界面,bc以便可以直覺地使用它,而不會被“卡住”的煩惱。我沒有太多時間來測試它,因為我陷入了另一個細節,即如何呈現結果(我認為這是一個字元串)。

舍入或截斷無關緊要,任何一個都可以。往下看,馬上就明白了。我使用 zsh 但外部工具會很好,因為我不會在任何時候或其他關鍵上下文中使用它,它只是一個桌面工具。

calc () {
   result=`bc <<EOF
   scale=3;
   $@
   EOF`
   echo ${result//%0/} # doesn't work; will only remove one zero
                       # also, if there are only zeroes, should
                       # remove dot as well - what about .333, etc.?
}

編輯

下面的解決方案給我留下了深刻的印象,尤其是如何noglob擺脫引號!

但是,使用點來強制浮點計算是我永遠不會記得的(你不使用這樣的普通計算器)。而且它甚至有點冒險,特別是對於浮點數不明顯會產生完全不同的結果(很可能是您想要的結果)時的計算。

此外,下面的計算顯示了一些不漂亮的輸出(太長的實數和尾隨的點)。

也許我應該將這個(其中一些)與下面@Gille答案的輸出格式結合起來?當我讓它完美地工作時,我會在這裡發布結果。(**編輯:**接受的答案效果很好。請務必閱讀對該答案的評論。)

calc () {
 echo $(($*));
}
alias calc='noglob calc'

calc 1./3
0.33333333333333331
calc 7.5 - 2.5
5.

使用zsh自己的算術,你可以這樣做:

calc() printf '%.6g\n' $(($*))
alias 'calc=noglob calc'

但這意味著您需要輸入數字123.才能將它們視為浮點並觸發浮點計算。

您可以通過附加.到任何不屬於十六進制數字(或另一個基數)或變數名稱或12e-20類型數字的十進制數字序列來解決此問題,例如:

setopt extendedglob
calc() printf '%.6g\n' $((${*//(#bm)(([0-9.]##[eE][-+][0-9]##|[[:alnum:]_#]#[.#_[:alpha:]][[:alnum:]_#]#)|([0-9]##))/$MATCH${match[3]:+.}}))
alias 'calc=noglob calc'

到那時,您可能會認為使用bc和修剪尾隨的 0 更容易。

另見awk

calc() awk "BEGIN{print $*}"

它支持較少的運算符和數學函式,但對您來說可能就足夠了。

引用自:https://unix.stackexchange.com/questions/66609