2012-01-13 33 views
5

我對/ bin/bash和使用printf格式化字符串的腳本有一個很奇怪的問題。/bin/bash printf與C的其他LANG不能一起工作

我的劇本是這樣的

rt=$(printf "%.3f" 13.234324245) 

與區別,我計算數13.23 ...以上。當我使用/ usr/bin/zsh時,效果很好!即使/斌/ sh可以做到這一點(但它不能做的東西...) 最大的問題是,/ bin/bash似乎不明白printf或確實有另一種格式化方式,當我不使用LANG=C

我的LANG變量設置爲de_AT.UTF-8,然後我得到這個錯誤:

/path/to/script: Zeile 12: printf: 13.234324245: Ungültige Zahl. 

所以它只是說,我給printf的數量是無效的......

我是否需要運行的printf以不同的方式?

編輯:這個問題似乎是對數的計算:

rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc)) 

我怎麼能告訴BC使用的,代替.

回答

4

您的問題源於LC_NUMERIC設置,這是bash在解析理論時所遵循的設置ts到printf

我覺得這種行爲可疑。 Ksh93還根據LC_NUMERIC解析數字,而pdksh和短劃線需要點作爲參數中的分隔符,而zsh接受點或本地格式。 POSIX沒有說,因爲指定的浮點格式在printfLC_NUMERIC必須在打印數字時必須遵守)是可選的。

作爲用戶,我建議您不要設置LC_NUMERICLC_COLLATE,除非您確定需要自己的行爲。這意味着不使用LANG並改爲設置特定類別;大多數人只需要LC_CTYPE(字符編碼),LC_MESSAGES(消息的語言)和LC_TIME(日期和時間格式)。在腳本中,您可以通過設置LC_ALL或通過設置特定類別(設置LANG僅覆蓋$LANG而不是用戶設置$LC_NUMERIC)來覆蓋所有類別。

#!/bin/sh 
LC_NUMERIC=C LC_COLLATE=C 
printf "%.3f" 13.234324245 
2

這可能是一個區域設置問題 - 我認爲德文中的小數點分隔符是逗號,而不是期間.。嘗試使用13,234324245作爲你的價值。

+0

這很有趣 – 2012-01-13 09:44:45

+0

但是那麼,當浮動是出來的BC時,我該怎麼做? sed呢? D: – reox 2012-01-13 09:46:05

+0

在這種情況下,最簡單的事情可能是使用@ J-16的解決方案並強制LANG = C。 – 2012-01-13 10:02:13

2

只是做一個$(LANG=C printf "%.3f" 13.234324245),只需設置LANG此命令

+2

我建議設置'LC_NUMERIC'而不是'LANG',以覆蓋用戶設置的'LC_NUMERIC'。或者甚至是LC_ALL都能勝過它們。 – Gilles 2012-01-13 19:05:32

1

您可以使用其他printf實現:與非內置的/ usr/bin中/ printf的:

% # LANG is ru_RU.UTF8, decimal separator is comma 
% /usr/bin/printf %.3f 3.14 
3,140 
% /usr/bin/printf %.3f 3,14 
/usr/bin/printf: 3,14: значение преобразовано не полностью 
3,000 
% LANG=C /usr/bin/printf %.3f 3,14 
printf: 3,14: value not completely converted 
3.00 

隨着zsh內置的printf實施:

% printf %.3f 3.14 
3,140 
% printf %.3f 3,14 
3,140 
相關問題