2009-10-06 28 views
25

なぜ私はわかりませんWikipedia lists Mathematica as a programming language with printf。私はMathematicaでこれを見つけることができませんでした。SprintfはMathematicaに相当しますか?

私の特定のタスクは、私は私がMathematicaで見つかった最も近い機能がPaddedFormある

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

とbashでそれを行うために使用され、パッド入りの番号を持つデータファイルのリストを処理することです。そして、いくつかの試行錯誤の後、私は

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

でそれを得た私が、私は「%05D」から得るものと同様の結果を得るために数4を使用する必要があることは非常に奇妙です。私はこの行動を全く理解していません。誰かが私にそれを説明することはできますか?

そして、これまで私がbashで使ってきたことを達成する最良の方法はありますか?

+0

です。これは奇妙なことです。私はMathematicaのprintfに相当することを知らなかったのです。私は以前PaddedForm(とすべての種類の精密コントロール)を使用してきました。私はPaddingFormのドキュメントを見て、余分なパディング文字について理解しようとしました。 +1。私は知りたいです。 – Cascabel

+1

私の理論は、WikipediaはMathematicaがStringFormを持っているのでprintfで言語としてリストしているということです。しかしStringFormはprintfの悲しい淡い影です。 – Pillsy

+0

['IntegerString'](http://reference.wolfram.com/language/ref/IntegerString.html) – yohai

答えて

9

これにはPaddedFormを使用しません。実際には、私はPaddedFormが何もかものために良いとは確信していません。代わりに、私はそうのような、古き良きToStringCharactersPadLeftを使用したい:

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

次に、あなたがあなたのファイル名を作るためにStringFormToStringを使用することができます。

toNumberedFileName[n_Integer] := 
    [email protected]["filename_``", toFixedWidth[n, 5]] 

Mathematicaは非常に適していませんこの種の弦楽器に。追加する

EDIT: Mathematicaが適切な必要な機能を持っていませんが、java.lang.Stringクラスはprintfスタイルの引数を取り、静的メソッドformat()を持っています。 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 :> [email protected], 
    x : (_Real | _Integer | True | 
     False | _String | _?JavaObjectQ) :> x, 
    x_ :> MakeJavaExpr[x]}, 
    {1}]] 

をJLINKが持つJava関数について少し間抜けですので、あなたは、もう少し作業を行う必要があります可変数の引数。 format()メソッドはフォーマット文字列とJavaの配列Objectを受け取り、Mathematicaは自動的に変換を行いません。これはMakeJavaObjectのためです。

+0

これは、実際には簡単なprintf関数の手順です。 – jxy

+0

そこに小さなバグ: "幅"の代わりに "w"。 – dreeves

+0

Java機能をお寄せいただきありがとうございます。私たちが持つ最高のもののようです。 – jxy

1

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

cat = [email protected]@(ToString/@{##})&; 

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

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

これは非常に多くのPillsyの答えのようなものですが、私はcatが少しきれいになりだと思います。 また、パッド関数で条件付きを使う方が安全だと思います。

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

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

私は同じ問題にかなりを実行して、決めました私自身の機能をコード化する。私はJavaではそれをしませんでしたが、代わりにMathematicaで文字列演算を使用しました。私は実際に%fの機能性も必要としていたので、かなり時間がかかりましたが、それはうまく動作しました。今はいつでも使用できるパッケージとして持っています。ここではGitHubのプロジェクトへのリンクです:

https://github.com/vlsd/MathPrintF

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

これは少なくともいくつかの場合に役立ちます。

2

IntegerStringあなたが必要とするのは正確です。この場合は

IntegerString[x,10,5] 
関連する問題