2012-06-27 43 views
1

我需要用bash做一些「漂亮」的數字格式。我有一串以科學格式(即3.14159或1.0601e-12)的逗號分隔的浮點數字,我需要創建一個以逗號分隔的列表,其中所有數字都有許多字符。是否使用空格或零填充並不重要(即'3.14'和'3.140000'都可以)。我試着用「%.12f」使用printf,但那當然不起作用。我的想法(除了在人物等級的工作,但似乎過於複雜)bash中浮點數的字符數不變

我真的很感激幫助。

+0

你是什麼意思的「當然不會工作」? – choroba

+0

,因爲printf「%.12f」在圓點後面打印了12個字符,這意味着它將數字12e-24變爲0 ......我需要能夠設置有效數字而不是小數點。 – foges

+1

您不能在同一個printf語句中同時使用字段寬度和精度修飾符 - 至少,不是在我的系統上。如果你需要兩者,你需要編碼。 –

回答

2

如果你只是想在你的輸出到指定的字符常量號碼,您可以使用場寬度修改。例如,爲了確保每個字段正好具有24個字符:

printf "%'24f\n" 3.140000 3000 
+0

謝謝,這很好解決它,不得不使用%e而不是%V作爲Hai Vu的建議。這解決了'printf'%'12e「3.140000' – foges

1

對於浮點,使用%F,用於科學記數法,使用%E:

$ printf "%12.2f\n" 359.197 
     359.20 
$ printf "%12.2e\n" 359.197 
    3.59e+02 
+0

謝謝,只需要添加'到您的解決方案來解決我的問題! – foges

0

補零,左邊是比更容易做一個動態的小數精度。這是對它的一個破解,不知道它是否符合你的要求。

IFS=, read -ra a <<<'1.234567e+3,5432.623,54326e+4,12.26546e+3,1000000000000,2.3641867e+4' 

for idx in "${!a[@]}"; do 
    printf -v "b[${b:=0}>b&&(b=$b),idx+1]" '%f%n' "${a[idx]}" b 
done 

for idx in "${!a[@]}"; do 
    printf -v 'a[idx]' '%#.*f' $((b - ${#b[idx+1]})) "${b[idx+1]}" 
done 

# IFS=, declare -a 'b=("${a[*]}")' 
# echo "$b" 
printf '%s\n' "${a[@]}" 

這給

1234.567000000 
5432.623000000 
543260000.0000 
12265.46000000 
1000000000000. 
23641.86700000 

雖然我喜歡看到一個更優雅的方式。

+0

廢話我誤讀了這個問題 - 零或空格填充*不重要。小女孩,夾頭。 – ormaaj