2009-10-06 11 views
25

मुझे नहीं पता क्यों विकिपीडिया lists Mathematica as a programming language with printf। मैं सिर्फ गणित में बराबर नहीं मिला।स्प्रिंटफ गणित में समकक्ष?

मेरे विशेष कार्य गद्देदार संख्या के साथ डेटा फ़ाइलों को, जो मैं निकटतम समारोह मैं Mathematica में पाया

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

साथ बैश में यह करने के लिए इस्तेमाल किया PaddedForm है की एक सूची पर कार्रवाई करने के लिए है। और कुछ परीक्षण और त्रुटि के बाद, मैं इसे

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

यह बहुत अजीब मैं परिणाम मैं क्या "% 05D" से प्राप्त करने के लिए इसी तरह की प्राप्त करने के लिए 4 नंबर का उपयोग करना होगा है के साथ मिल गया। मैं इस व्यवहार को बिल्कुल समझ नहीं पा रहा हूं। क्या कोई मुझे यह समझा सकता है?

और क्या यह बैश में उपयोग करने के लिए सबसे अच्छा तरीका है?

+0

यह विचित्र है - मुझे मैथमैटिका के समकक्ष एक प्रिंटफ के बारे में कभी पता नहीं था। मैंने पहले से पैडडफॉर्म (और सभी प्रकार के परिशुद्धता नियंत्रण) सामान का उपयोग किया है। मैंने पैडिंगफॉर्म दस्तावेज पर भी देखा है जो पैडिंग के उस अतिरिक्त चरित्र के बारे में जानने की कोशिश कर रहा है। +1। मैं जानना चाहता हूँ। – Cascabel

+1

मेरा सिद्धांत यह है कि विकिपीडिया ने गणित को प्रिंटफ के साथ एक भाषा के रूप में सूचीबद्ध किया है क्योंकि इसमें स्ट्रिंगफॉर्म है। लेकिन स्ट्रिंगफॉर्म printf की एक उदास, पीला छाया है। – Pillsy

+0

['इंटेगरस्ट्रिंग'] (http://reference.wolfram.com/language/ref/IntegerString.html) – yohai

उत्तर

9

मैं इसके लिए PaddedForm का उपयोग नहीं करता। वास्तव में, मुझे यकीन नहीं है कि PaddedForm कुछ भी के लिए अच्छा है। इसके बजाय, मैं प्रयोग करेंगे अच्छे पुराने ToString, Characters और PadLeft, इसलिए जैसे:

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

तो फिर तुम StringForm और ToString उपयोग कर सकते हैं अपनी फ़ाइल नाम बनाने के लिए:

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

मेथेमेटिका अच्छी तरह से अनुकूल नहीं है इस तरह के स्ट्रिंग मुंगिंग के लिए।

संपादित करें जोड़ने के लिए: मेथेमेटिका उचित आवश्यक सुविधा उपलब्ध नहीं है, लेकिन java.lang.String वर्ग स्थिर विधि 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 :> [email protected], 
    x : (_Real | _Integer | True | 
     False | _String | _?JavaObjectQ) :> x, 
    x_ :> MakeJavaExpr[x]}, 
    {1}]] 

क्योंकि JLink एक साथ जावा कार्यों के बारे में थोड़ा गूंगा है आप एक छोटे से अधिक काम करने की जरूरत है तर्कों की परिवर्तनीय संख्या। format() विधि एक प्रारूप स्ट्रिंग और जावा Object एस की एक सरणी लेती है, और गणित स्वचालित रूप से रूपांतरण नहीं करेगा, जो MakeJavaObject है।

+0

यह एक साधारण printf फ़ंक्शन के लिए वास्तव में बहुत ही जटिल प्रक्रिया है। – jxy

+0

वहां छोटी छोटी बग: "चौड़ाई" के बजाय "डब्ल्यू"। – dreeves

+0

जावा फ़ंक्शन के लिए धन्यवाद। ऐसा लगता है कि हम सबसे अच्छे हैं। – jxy

1

मैं पिल्सी से सहमत हूं। यहां मैं यह कैसे करूंगा। आसान 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 बनाता है यह एक छोटे से क्लीनर। इसके अलावा, मुझे लगता है कि पैड फ़ंक्शन में सशर्त होना सुरक्षित है - गलत संख्या से पैडिंग गलत होना बेहतर है।

5

आपको ऐसे फ़ंक्शन जो StringForm [] और प्रयोग IntegerString या गद्दी कार्यों के लिए सभी तर्कों से गुजरता के रूप में पहले उल्लेख निर्धारित कर सकते हैं:

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

मैं एक ही समस्या में काफ़ी हो चुकी है, और निर्णय लिया अपने स्वयं के समारोह को कोड करने के लिए। मैंने जावा में ऐसा नहीं किया लेकिन इसके बजाय मैथमैटिका में स्ट्रिंग ऑपरेशंस का इस्तेमाल किया। यह काफी लंबा हो गया, क्योंकि मुझे वास्तव में% f कार्यक्षमता की भी आवश्यकता है, लेकिन यह काम करता है, और अब मेरे पास यह एक पैकेज है जिसे मैं किसी भी समय उपयोग कर सकता हूं।

https://github.com/vlsd/MathPrintF

यह (वास्तव में सिर्फ $ पथ में कहीं निर्देशिका को कॉपी) स्थापना के निर्देश के साथ आता है: यहाँ GitHub परियोजना के लिए एक लिंक है।

आशा है कि यह कम से कम कुछ के लिए सहायक होगा।

2

IntegerString वही करता है जो आपको चाहिए। इस मामले में यह

IntegerString[x,10,5]