2012-04-26 15 views
8

के लिए फ्लोट स्वरूपित करते समय आंशिक और अंकों की कुल संख्या दोनों को सीमित करना मुझे सीमित चौड़ाई के क्षेत्र में सबसे अधिक कुशलता से फ़्लोट मान मुद्रित करने की आवश्यकता है। मैं NSNumberFormatter का उपयोग कर रहा हूं, और मैंने दशमलव बिंदु के बाद डिफ़ॉल्ट संख्या के रूप में दो नंबर सेट किए हैं, ताकि जब मेरे पास 234.25 जैसी संख्या हो, तो यह 234.25 जैसा मुद्रित है। लेकिन जब मेरे पास 1234.25 है, तो मैं इसे मुद्रित करना चाहता हूं: 1234.3, और 11234.2511234 मुद्रित किया जाना चाहिए।प्रदर्शन

मुझे बिंदु के बाद अधिकतम दो अंक की आवश्यकता है, और यदि मेरे पास बिंदु के बाद अंक हैं तो कुल मिलाकर अधिकतम पांच अंक, लेकिन पूर्णांक भाग में अधिक होने पर इसे पांच अंकों से अधिक प्रिंट करना चाहिए।

मुझे NSNumberFormatter में अंकों की कुल संख्या सीमित करने की क्षमता दिखाई नहीं दे रही है। क्या इसका मतलब यह है कि मुझे इस तरह के प्रारूपों को प्रारूपित करने के लिए अपना स्वयं का फ़ंक्शन लिखना चाहिए? यदि ऐसा है, तो संख्या के पूर्णांक और fractional भागों में अंकों की गिनती प्राप्त करने का सही तरीका क्या है? मैं अतिरिक्त प्रकार के रूपांतरणों से बचने के लिए NSNumber के बजाय CGFLoat के साथ काम करना पसंद करूंगा।

उत्तर

0

यहाँ मैं कैसे मेरे कोड में यह लागू किया है। मुझे नहीं पता कि यह कितना कुशल है, मुझे बुरा नहीं लगता है।

तो मैं एक वैश्विक NSNumberFormatter

NSNumberFormatter* numFormatter; 

बना सकते हैं और इसे कहीं से प्रारंभ:

numFormatter=[[NSNumberFormatter alloc]init]; 

तो मैं निम्नलिखित समारोह के साथ संख्या स्वरूप:

- (NSString*)formatFloat:(Float32)number withOptimalDigits:(UInt8)optimalDigits maxDecimals:(UInt8)maxDecimals 
{ 
    NSString* result; 
    UInt8 intDigits=(int)log10f(number)+1; 
    NSLog(@"Formatting %.5f with maxDig: %d maxDec: %d intLength: %d",number,optimalDigits,maxDecimals,intDigits); 

    numFormatter.maximumFractionDigits=maxDecimals; 
    if(intDigits>=optimalDigitis-maxDecimals) { 
     numFormatter.usesSignificantDigits=YES; 
     numFormatter.maximumSignificantDigits=(intDigits>optimalDigits)?intDigits:optimalDigits; 
    } else { 
     numFormatter.usesSignificantDigits=NO; 
    } 
    result = [numFormatter stringFromNumber:[NSNumber numberWithFloat:number]]; 

    return result; 
} 
1

कोड:

#define INTPARTSTR(X) [NSString stringWithFormat:@"%d",(int)X] 
#define DECPARTSTR(X) [NSString stringWithFormat:@"%d",(int)(((float)X-(int)X)*100)] 

- (NSString*)formatFloat:(float)f 
{ 
    NSString* result; 

    result = [NSString stringWithFormat:@"%.2f",f]; 

    if ([DECPARTSTR(f) isEqualToString:@"0"]) return INTPARTSTR(f); 
    if ([INTPARTSTR(f) length]==5) return INTPARTSTR(f); 

    if ([result length]>5) 
    { 
     int diff = (int)[result length]-7; 

     NSString* newResult = @""; 

     for (int i=0; i<[result length]-diff-1; i++) 
      newResult = [newResult stringByAppendingFormat:@"%c",[result characterAtIndex:i]]; 

     return newResult; 
    } 


    return result; 
} 

परीक्षण यह:

- (void)awakeFromNib 
{ 
    NSLog(@"%@",[self formatFloat:234.63]); 
    NSLog(@"%@",[self formatFloat:1234.65]); 
    NSLog(@"%@",[self formatFloat:11234.65]); 
    NSLog(@"%@",[self formatFloat:11234]); 
} 

आउटपुट:

2012-04-26 19:27:24.429 newProj[1798:903] 234.63 
2012-04-26 19:27:24.432 newProj[1798:903] 1234.6 
2012-04-26 19:27:24.432 newProj[1798:903] 11234 
2012-04-26 19:27:24.432 newProj[1798:903] 11234 
+1

@JacquesCousteau मुझे पता है का उपयोग करें; यह अभी भी एक उदाहरण है, है ना? –

+0

धन्यवाद। यह कार्यान्वयन काफी सार्वभौमिक दिखता है, लेकिन मैं दक्षता के बारे में चिंतित हूं। क्या एनएसएसटींग की तुलना में कुछ और कुशल हो सकता है? या स्ट्रिंग की लंबाई गिनने के अलावा संख्या में अंकों की संख्या गिनने का कोई तरीका नहीं है? मैं प्रोग्राम के चलते हर समय एनीमेशन के हर फ्रेम में लगातार यह रूपांतरण करने जा रहा हूं। क्या यह मुश्किल नहीं होगा? – BartoNaz

+2

@ बार्टोनाज़: किसी संख्या का आधार -10 लॉगरिदम लगभग पूर्णांक की लंबाई - 1 है: 'log10f (11123.25) -> 4.046221' –

12

आप विशेष गोल करने वाले व्यवहार के साथ "अधिकतम महत्वपूर्ण अंक" और "अधिकतम अंश अंक" के संयोजन की तलाश में हैं।

float twofortythreetwentyfive = 234.25; 
float onetwothreefourtwentyfive = 1234.25; 
float eleventwothreefourtwentyfive = 11234.25; 

NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; 
[formatter setUsesSignificantDigits:YES]; 
[formatter setMaximumSignificantDigits:5]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setRoundingMode:NSNumberFormatterRoundCeiling]; 

NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:twofortythreetwentyfive]]); 
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:onetwothreefourtwentyfive]]); 
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:eleventwothreefourtwentyfive]]); 

परिणाम::

2012-04-26 16: 32: ०४.४८१ SignificantDigits [11565: 707] 234.25
2012-04-26 16:32 NSNumberFormatter कार्य के बराबर है: ०४.४८२ SignificantDigits [11565: 707] 1234.3
2012-04-26 16: 32: ०४.४८३ SignificantDigits [11565: 707] 11235

+0

अच्छा जवाब, शुद्ध obj-c। –

+0

धन्यवाद। यह वास्तव में सरल लग रहा है। लेकिन अगर मेरे पास नंबर है: 211234.25 यह 211230 लौटाएगा। लेकिन मैं इसे 211234 वापस लौटना चाहूंगा ताकि यह केवल फ़्लोटिंग भाग को गोल कर सके, और पूर्णांक भाग को छूटे रहना चाहिए। क्या यह अभी भी NSNumberFormatter के साथ संभव है? – BartoNaz

+0

तो मैं चाहता हूं कि मेरी मुद्रित संख्या की बेहतर लंबाई 5 अंकों से बड़ी न हो। तो अगर मैं <= 3 पूर्णांक अंक प्राप्त करता हूं तो मैं इसे पूर्ण प्रिंट करता हूं। यदि 4 पूर्णांक और अधिक है, तो मैंने दशमलव भाग काट दिया। पूर्णांक अंकों में कोई बदलाव नहीं। दशमलव भाग के अनुसार केवल अंतिम अंक बदला जा सकता है। – BartoNaz

0

यह एक बग जब है और maximumSignificantDigits का उपयोग करकेपर आईओएस 8 पर?

 NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
     formatter.maximumFractionDigits = 2; 
     formatter.maximumSignificantDigits = 3; 
     NSLog(@"%@", [formatter stringFromNumber:@(0.3333)]); // output 0.333 expected 0.33 

यह ठीक काम करता है अगर मैं केवल maximumFractionDigits

 NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
     formatter.maximumFractionDigits = 2; 
     NSLog(@"%@", [formatter stringFromNumber:@(0.3333)]); // output expected .33 

NSNumberFormatter maximumFractionDigits and maximumSignificantDigits bug

संबंधित मुद्दे