Wolfram mathematica Mathematica中的Sprintf等价物?

Wolfram mathematica Mathematica中的Sprintf等价物?,wolfram-mathematica,Wolfram Mathematica,我不知道为什么维基百科。我只是在Mathematica中找不到等价物 我的具体任务是处理带有填充数字的数据文件列表,我在bash中使用填充数字进行处理 fn=$(printf "filename_%05d" $n) 我在Mathematica中找到的最接近的函数是PaddedForm。经过反复试验,我终于明白了 "filename_" <> PaddedForm[ Round@#, 4, NumberPadding -> {"0", ""} ]& “文件名”填充格式

我不知道为什么维基百科。我只是在Mathematica中找不到等价物

我的具体任务是处理带有填充数字的数据文件列表,我在bash中使用填充数字进行处理

fn=$(printf "filename_%05d" $n)
我在Mathematica中找到的最接近的函数是
PaddedForm
。经过反复试验,我终于明白了

"filename_" <> PaddedForm[ Round@#, 4, NumberPadding -> {"0", ""} ]&
“文件名”填充格式[Round@#,4,NumberPadding->{“0”,“”]&
非常奇怪的是,我必须使用数字4来得到与我从“%05d”得到的结果相似的结果。我完全不理解这种行为。有人能给我解释一下吗


这是实现我在bash中使用的最佳方式吗?

我不会为此使用
PaddedForm
。事实上,我不确定
PaddedForm
对任何事情都有好处。相反,我会使用好的旧
字符串
字符
左键
,如下所示:

toFixedWidth[n_Integer, width_Integer] := 
  StringJoin[PadLeft[Characters[ToString[n]], width, "0"]]
然后,您可以使用
StringForm
ToString
生成文件名:

toNumberedFileName[n_Integer] :=
  ToString@StringForm["filename_``", toFixedWidth[n, 5]]
Mathematica不太适合这种啃线

编辑以添加:Mathematica本身没有所需的功能,但是
java.lang.String
类具有静态方法
format()
,该方法采用
printf
样式的参数。您可以使用Mathematica的JLink功能非常轻松地调用它。性能不会很好,但对于许多用例,您不会太在意:

Needs["JLink`"];
LoadJavaClass["java.lang.String"];
LoadJavaClass["java.util.Locale"];
sprintf[fmt_, args___] :=
 String`format[Locale`ENGLISH,fmt,
  MakeJavaObject /@
   Replace[{args},
    {x_?NumericQ :> N@x,
     x : (_Real | _Integer | True | 
         False | _String | _?JavaObjectQ) :> x,
     x_ :> MakeJavaExpr[x]},
    {1}]]
您需要做更多的工作,因为JLink对于参数数量可变的Java函数有点笨。
format()
方法接受一个格式字符串和一个Java
对象数组,Mathematica不会自动进行转换,这就是
MakeJavaObject
的目的。

我同意Pillsy的观点。 我会这样做的。 请注意方便的
cat
函数,我认为它有点像sprintf(减去StringForm提供的占位符),因为它的工作原理类似于打印(您可以打印表达式的任何串联,而无需转换为字符串),但生成一个字符串而不是发送到stdout

cat = StringJoin@@(ToString/@{##})&;

pad[x_, n_] := If[StringLength@cat[x]>=n, cat[x], 
                                          cat@@PadLeft[Characters@cat[x],n,"0"]]

cat["filename_", pad[#, 5]]&
这很像Pillsy的答案,但我认为
cat
会让它更干净一些。
另外,我认为在pad函数中使用该条件更安全——最好是填充错误,而不是数字错误。

您还可以定义一个函数,将所有参数传递给StringForm[],并使用IntegerString或前面提到的填充函数:

Sprintf[args__] := StringForm[args__] // ToString;
file = Sprintf["filename_``", IntegerString[n, 10, 5]];

我经常遇到同样的问题,并决定编写自己的函数。我不是用Java做的,而是用Mathematica中的字符串操作。结果很长,因为我实际上也需要%f功能,但它可以工作,现在我把它作为一个包,可以随时使用。以下是GitHub项目的链接:

它附带安装说明(实际上只是将目录复制到$Path中的某个位置)

希望这将对至少一些人有所帮助。

正是您所需要的。在这种情况下,它将是

IntegerString[x,10,5]

这很奇怪-我从来没有意识到Mathematica中有printf等价物。我以前用过很多PaddedForm(和各种精度控制)的东西。我也一直在关注PaddedForm文档,试图找出padding的额外特性+1.我想知道,我的理论是维基百科把Mathematica列为一种带有printf的语言,因为它有StringForm。但是StringForm是printf的一个悲哀而苍白的阴影。既然这个老问题再次出现,为什么没有人去修复wikipedia页面。对于一个简单的printf函数来说,这确实是一个非常复杂的过程。那里的小错误是:“w”而不是“宽度”。感谢java函数。看来这是我们能得到的最好的了。