Matlab sprintf 格式化

发布于 2024-10-31 06:04:00 字数 1071 浏览 0 评论 0原文

编辑:我已经将问题改写得更清楚了。

有谁知道让 sprintf 打印“%.6f 并消除尾随零”的巧妙方法吗?这就是我正在寻找的:

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.456789012345];
for j = 1:length(mat)
    fprintf('%s ', strrep(num2str(mat(j),20), ' ', ''));
end

我认为除了循环遍历每个元素并根据 mod(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

EDIT: I've reworded the question to be clearer.

Does anyone know a clever way to get sprintf to print "%.6f with trailing zeros elminated"? This is what I'm looking for:

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

where %somemagic is some magical specifier. None of the formats seem to work.

% 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.456789012345];
for j = 1:length(mat)
    fprintf('%s ', strrep(num2str(mat(j),20), ' ', ''));
end

I don't think there is a way to do it other than looping through each element and changing the specifier based off of mod(x,1)==0 or using regexp to remove trailing zeros. But you never know, the crowd is more clever than I.

My actual application is to print out the array elements in an html table. This is my current clunky solution:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

若有似无的小暗淡 2024-11-07 06:04:00

编辑:更新以解决已编辑的问题...

我认为没有任何方法可以使用 SPRINTF,但您可以使用函数 NUM2STRREGEXPREP

>> mat = [12345678 123.45 123.456789012345];       %# 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

EDIT: Updated to address the edited question...

I don't think there's any way to do it with a particular format string for SPRINTF, but you could instead try this non-loop approach using the functions NUM2STR and REGEXPREP:

>> mat = [12345678 123.45 123.456789012345];       %# 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
酷炫老祖宗 2024-11-07 06:04:00

问题是您在数组中混合了 int 和 float 。 Matlab 不喜欢这样,所以它会将将 int 转换为 float,以便数组中的所有元素都具有相同类型。看看 doc sprintf:你现在被迫使用 %f,浮点数上的 %e 或 %g

虽然我承认我喜欢上面(或下面)的 STRREP 方法

The problem is that you're mixing an int with a float in an array. Matlab doesn't like that so it will convert your int to a float so that all elements in the array are of the same type. Look at doc sprintf: you're now forced to use %f, %e or %g on floats

Although I admit I like the STRREP method above (or below)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文