2011-04-09 93 views
2

編輯:我已經重新提出了這個問題要更清楚。Matlab sprintf格式

有沒有人知道一個聰明的方式讓sprintf打印「%.6f尾隨零elminated」?這就是我要找的:

sprintf('%somemagic ', [12345678 123.45]) 
ans = 1234578 123.45 

其中%somemagic是一些神奇的說明符。沒有一種格式似乎工作。

% no trailing zeros, but scientific for big nums 
sprintf('%g ', [12345678 123.45]) 
ans = 1.23457e+007 123.45 

% not approp for floats 
sprintf('%d ', [12345678 123.45]) 
ans = 12345678 1.234500e+002 

% trailing zeros 
sprintf('%f ', [12345678 123.45]) 
ans = 12345678.000000 123.450000 

% cannot specify sig figs after decimal (combo of gnovice's approaches) 
mat = [12345678 123.45 123.456789]; 
for j = 1:length(mat) 
    fprintf('%s ', strrep(num2str(mat(j),20), ' ', '')); 
end 

我不認爲有一種方法可以做到這一點比通過每個元件循環以及基於關模的說明符其它(X,1)== 0或正則表達式使用以除去尾隨零。但你永遠不知道,人羣比我更聰明。

我的實際應用是打印出html表格中的數組元素。這是我目前笨重的解決方案:

for j = 1:length(mat) 
    if mod(mat(j),1) == 0 
     fprintf('<td>%d</td>', mat(j)); 
    else 
     fprintf('<td>%g</td>', mat(j)); 
    end 
end 

回答

4

編輯:更新來解決問題編輯...

我不認爲有任何方式與特定格式字符串做了SPRINTF,但你可以使用函數NUM2STRREGEXPREP,而不是嘗試這種非循環的方法:

>> mat = [12345678 123.45 123.456789];  %# Sample data 
>> str = num2str(mat,'<td>%.6f</td>');    %# Create the string 
>> str = regexprep(str,{'\.?0+<','\s'},{'<',''}); %# Remove trailing zeroes 
                %# and whitespace 
>> fprintf(str);         %# Output the string 

<td>12345678</td><td>123.45</td><td>123.456789</td> %# Output 
+0

+1我希望避免regexprep,但我喜歡我可以避免循環。 – 2011-04-10 21:46:21

0

的問題是,你是混合的int在一個陣列的浮動。 Matlab不喜歡,所以它將您的int轉換爲浮點數,以便數組中的所有元素都是相同的類型。看看doc sprintf:你現在不得不使用%F,%e或%G上彩車

雖然我承認我喜歡STRREP法高於(或低於)

+0

我所有的號碼都是雙打的。我的問題是我不想用科學記數法打印大量數字的數字,但是我不希望用尾隨零打印少數數字的數字。 – 2011-04-09 22:56:07