2009-10-06 6 views
25

나는 왜 위키 백과 lists Mathematica as a programming language with printf을 모르겠다. Mathematica에서 이에 상응하는 것을 찾을 수 없었습니다.Sprintf는 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가 StringForm을 가지고 있기 때문에 Mathematica를 printf와 함께 언어로 나열한다는 것이다. 그러나 StringForm은 슬프고 창백한 printf의 그림자입니다. – Pillsy

+0

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

답변

9

나는 이것을 위해 PaddedForm을 사용하지 않을 것입니다. 사실, 나는 PaddedForm이 그 무엇이든지에게 좋은지 확신하지 못합니다. 대신, 내가 사용하는 거라고 좋은 오래된 ToString, CharactersPadLeft과 같이 :

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

티카는 적합하지 않다 :

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

그런 다음 파일 이름을 만들기 위해 StringFormToString을 사용할 수 있습니다 이런 종류의 문자열 munging. 티카 적절한 필요한 기능을 가지고 있지 않지만, 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는 자바의 기능에 대해 조금 바보이기 때문에 당신은 조금 더 많은 작업을 할 필요가 가변 인수 수. format() 메서드는 형식 문자열과 Java Object 배열을 취하며 Mathematica는 변환을 자동으로 수행하지 않습니다. 이는 MakeJavaObject이있는 것입니다.

+0

이것은 실제로 간단한 printf 기능을위한 매우 복잡한 절차입니다. – jxy

+0

거기에 작은 버그 : "너비"대신 "w". – dreeves

+0

자바 기능을 이용해 주셔서 감사합니다. 우리가 가질 수있는 최선책처럼 보입니다. – jxy

1

나는 Pillsy에 동의합니다. 다음은 어떻게 수행할까요? 유용한 (문자열로 변환하지 않고 표현식의 모든 연결을 인쇄 할 수있는) Print와 같이 작동하지만 보내는 대신 문자열을 생성한다는 점에서 sprintf (StringForm과 같은 자리 표시 자 제외)와 같은 것으로 생각되는 편리한 cat 함수에 유의하십시오. 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가 조금 청소기하게 생각합니다. 또한 pad 함수에서 조건부를 사용하는 것이 더 안전하다고 생각합니다. 잘못된 숫자보다 잘못된 값을 갖는 것이 좋습니다.

5

당신은 이전에 언급 한 바와 같이 StringForm []를 사용 IntegerString 또는 패딩 기능에 대한 모든 인수를 전달하는 기능을 정의 할 수 있습니다 : 나는이 같은 문제로 꽤 실행했습니다

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

, 그리고 결정 내 자신의 기능을 코드화한다. Java에서는하지 않았지만 대신 Mathematica에서 문자열 연산을 사용했습니다. 실제로 % f 기능이 필요했기 때문에 꽤 길었습니다. 그러나 작동하고, 이제는 언제든지 사용할 수있는 패키지로 사용합니다.

https://github.com/vlsd/MathPrintF

그것은 (정말 그냥 $ 경로 어딘가에 디렉토리를 복사) 설치 지침을 함께 제공 : 다음은 GitHub의 프로젝트에 대한 링크입니다.

희망은 적어도 일부 사람들에게 도움이 될 것입니다.

2

IntegerString 정확히 필요한 작업을 수행합니다. 이 경우에는

IntegerString[x,10,5] 
관련 문제