27

ウィキペディアがなぜprintfを使ったプログラミング言語としてMathematicaをリストしているのか分かりません。Mathematicaで同等のものを見つけることができませんでした。

私の特定のタスクは、数字が埋め込まれたデータファイルのリストを処理することです。

fn=$(printf "filename_%05d" $n)

Mathematicaで見つけた最も近い関数はですPaddedForm。そして、いくつかの試行錯誤の後、私はそれを手に入れました

"filename_" <> PaddedForm[ Round@#, 4, NumberPadding -> {"0", ""} ]&

「%05d」から得られる結果と同様の結果を得るために、数字の4を使用しなければならないのは非常に奇妙です。私はこの振る舞いをまったく理解していません。誰かが私にそれを説明できますか?

そして、それは私がbashで使用していたことを達成するための最良の方法ですか?

4

5 に答える 5

9

私はこれには使用PaddedFormしません。実際、それが何にでも役立つかどうかPaddedFormはわかりません。代わりに、私は古き良きToStringCharactersそしてPadLeft、のように使用します:

toFixedWidth[n_Integer, width_Integer] := 
  StringJoin[PadLeft[Characters[ToString[n]], width, "0"]]

次に、とを使用StringFormToStringてファイル名を作成できます。

toNumberedFileName[n_Integer] :=
  ToString@StringForm["filename_``", toFixedWidth[n, 5]]

Mathematicaはこの種の文字列の変更にはあまり適していません。

追加するための編集: Mathematica本体には必要な機能がありませんが、クラスには-style引数を取るjava.lang.String静的メソッドがあります。MathematicaのJLink機能を使って簡単に呼び出すことができます。パフォーマンスはあまり良くありませんが、多くのユースケースではそれほど気にしないでしょう:format()printf

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()メソッドはフォーマット文字列とJavaObjectの配列を取り、Mathematicaは自動的に変換を行いません。これMakeJavaObjectが目的です。

于 2009-10-06T16:51:21.533 に答える
8

私は同じ問題にかなり遭遇し、自分の関数をコーディングすることにしました。私はJavaでそれをしませんでしたが、代わりにMathematicaで文字列操作を使用しました。実際には%f機能も必要だったので、かなり長いことがわかりましたが、機能し、いつでも使用できるパッケージとして入手できました。GitHubプロジェクトへのリンクは次のとおりです。

https://github.com/vlsd/MathPrintF

インストール手順が付属しています(実際には、$ Pathのどこかにディレクトリをコピーするだけです)。

これが少なくとも一部の人に役立つことを願っています。

于 2011-08-25T12:07:29.727 に答える
5

また、すべての引数をStringForm []に渡す関数を定義し、前述のようにIntegerStringまたはパディング関数を使用することもできます。

Sprintf[args__] := StringForm[args__] // ToString;
file = Sprintf["filename_``", IntegerString[n, 10, 5]];
于 2011-06-08T16:13:13.357 に答える
2

IntegerStringまさにあなたが必要なことをします。この場合、

IntegerString[x,10,5]
于 2014-10-21T20:53:42.187 に答える
1

Pillsyに同意します。これが私がそれをする方法です。catPrint(Stringに変換せずに式の連結を印刷できます)のように機能しますが、stdoutに送信する代わりに文字列を生成するという点で、sprintf(StringFormのようなプレースホルダーを除く)のような便利な関数に注意してください。。

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

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

cat["filename_", pad[#, 5]]&

catこれはピルジーの答えと非常によく似ていますが、少しきれいになると思います。また、pad関数で条件付きにする方が安全だと思います。数字を間違えるよりも、パディングを間違える方がよいでしょう。

于 2010-04-18T14:28:38.917 に答える