2012-11-03 11 views
5

क्या संख्याओं को प्रारूपित करने का कोई त्वरित तरीका है (उदाहरण के लिए, appendFormat का उपयोग करते समय) ताकि केवल पर्याप्त दशमलव स्थान दिखाए जा सकें? उदाहरण के लिए, 4.23100 4.231 के रूप में दिखाया गया है, जबकि 5.0000 को केवल 5 के रूप में दिखाया गया है।उद्देश्य सी: "बस पर्याप्त" दशमलव स्थानों के साथ स्वरूपण संख्या

पढ़ने के लिए धन्यवाद।

+5

यह समझ में नहीं आता है क्योंकि फ़्लोटिंग-पॉइंट प्रतिनिधित्व सटीक नहीं है। ** आप ** आवश्यक दशमलव स्थान निर्दिष्ट करें। –

+1

टिप्पणी के लिए धन्यवाद। उम्मीद है कि यह चीजों को स्पष्ट करता है: यदि मेरे पास दो चर थे, तो x = 4.231 और y = 5 कहें, और मैं उनके साथ एक स्ट्रिंग बनाना चाहता हूं, जैसे @ "% f +% f", मैं "4.231000 + 5.000000" । हालांकि, मुझे "4.231 + 5" की आवश्यकता है और मैं सोच रहा हूं कि ऐसा करने के लिए कोई कार्यक्षमता है या नहीं, या मैं सिर्फ फ़ंक्शन को कोड करता हूं या नहीं। – Rogare

+3

@Rogare 'x' प्रारंभ होने के बाद इसका मान' 4.2309999999999998721023075631819665431976318359375' है। अब संकलक कैसे तय कर सकता है कि आप कितने अंक चाहते हैं? –

उत्तर

2

% छ% च के बजाय का उपयोग करें

डबल एन = 1234.5678;

एनएसएसटींग स्ट्र = [एनएसएसटींग स्ट्रिंगविथफॉर्मैट: @ "संख्या% g" है, n];

+1

हाय रोजर, उत्तर के लिए धन्यवाद! मैंने इस कोड की कोशिश की और वास्तव में यह 1234.56 लौटाता है। उस ने कहा, मुझे विश्वास है कि अगर मैं NSNumberFormatter क्लास का उपयोग करता हूं (उदाहरण के लिए, http://stackoverflow.com/questions/7271560/correct-use-of-format-specifier-to-show-up-to-three-decimals-if- आवश्यक-अन्य) और अधिकतम फ्रेक्शनडिजिट्स को बढ़ाएं, इसे आवश्यकतानुसार काम करना चाहिए। धन्यवाद! – Rogare

+0

संदर्भित [यहां] (http://stackoverflow.com/a/5913115/1202222),% g रूपांतरण 6 महत्वपूर्ण आंकड़ों तक डिफ़ॉल्ट होगा जब तक अधिकतम निर्दिष्ट नहीं किया जाता है। % .8g या बड़ा सभी वांछित फ्लोट देंगे। –

0

मुझे पहले ऐसा करने का एक अंतर्निहित तरीका नहीं मिला, इसलिए यदि कोई दिलचस्पी लेता है तो मैंने एक त्वरित कार्य (नीचे) बनाया। उस ने कहा, मुझे विश्वास है कि% g (धन्यवाद MSgambel, रोजर Gilbrat) और NSNumberFormatter वर्ग (धन्यवाद Inafziger, डेविड नेड्रो) यह बहुत अधिक संक्षेप में करते हैं, तो वे शायद बेहतर विकल्प हैं!

+ (NSString *)trimmedFraction:(float)fraction{ 

    int i=0; 
    float numDiff=0; 

    // Loop through possible decimal values (in this case, maximum of 6) 
    for (i=0;i<=6;i++){ 

     // Calculate difference between fraction and rounded fraction 
     numDiff=round(fraction*pow(10,i))/pow(10,i)-fraction; 

     // Check if difference is less than half of the smallest possible value 
     if (fabsf(numDiff)<(0.5*pow(10,-6))){ 
      break; 
     } 
    } 

    // Return string of truncated fraction 
    NSString *stringPattern=[NSString stringWithFormat:@"%%0.%df",i]; 
    return [NSString stringWithFormat:stringPattern,fraction]; 
} 

कोड में आप दशमलव रिक्त स्थान की अधिकतम संख्या निर्दिष्ट कर सकते हैं (उदाहरण के लिए, इस मामले में 6)। फिर आप इसे केवल एक अंश भेजते हैं और यह केवल प्रासंगिक दशमलव के साथ एक स्ट्रिंग देता है। उदाहरण के लिए, इसे 4.231000 भेजें और यह @ 4.231 "लौटाता है, इसे 5.000000 भेजें और यह @ 5" लौटाता है। (फिर, शायद% g और NSNumberWithFormatter का उपयोग करने के लिए शायद बेहतर है)।

0

यदि आप फ़्लोटिंग-पॉइंट नंबरों के बजाय मूल मानों को तारों के रूप में संग्रहीत करते हैं, तो सवाल बहुत समझ में आता है। उचित परिशुद्धता के साथ% छ

+ (NSString *) stringForNotANumber { 
    static NSString *singleton; 
    if (!singleton) singleton = @"NaN"; 
    return singleton; 
} 

- (NSUInteger) numberOfDecimalPlaces { 
    NSString *strValue = self; 

    // If nil, return -1 
    if (!strValue) return -1; 

    // If non-numeric, return -1 
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; 
    [f setMaximumFractionDigits:128]; 
    NSNumber *numValue = [f numberFromString:strValue]; 
    if (!numValue) return -1; 

    // Count digits after decimal point in original input 
    NSRange range = [strValue rangeOfString:@"."]; 
    if (NSNotFound == range.location) return 0; 

    return [strValue substringFromIndex:range.location+1].length; 
} 

- (NSString *) plus:(NSString *) addend1 { 
    NSString *addend2 = self; 

    if (!addend1 || !addend2) return nil; 
    if (addend1 == [NSString stringForNotANumber] || 
     addend2 == [NSString stringForNotANumber]) 
     return [NSString stringForNotANumber]; 

    NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; 
    NSNumber *num1 = [f numberFromString:addend1]; 
    NSNumber *num2 = [f numberFromString:addend2]; 
    if (!num1 || !num2) return [NSString stringForNotANumber]; 

    double sum = num1.doubleValue + num2.doubleValue; 

    [f setMinimumFractionDigits:MAX(addend1.numberOfDecimalPlaces, 
            addend2.numberOfDecimalPlaces)]; 

    return [f stringFromNumber:[NSNumber numberWithDouble:sum]]; 
} 
+0

या आप केवल 'NSDecimalNumber' का उपयोग कर सकते हैं जो आपके लिए इन सभी समस्याओं (और अधिक) को हल करता है। :) – lnafziger

+0

क्या '-डिस्क्रिप्शन विथलोकेल:' केवल "दशमलव स्थान का उपयोग करें? – paulmelnikow

+0

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि हाँ। 'stringValue' निश्चित रूप से करता है। – lnafziger

2

उपयोग:

मैं इस एक वर्ग का उपयोग कर NSString पर संभाल।

double number = 1234.123; 

NSLog(@"Number equals: %.8g", number) 

रूप here संदर्भित% छ रूपांतरण जब तक कि एक अधिकतम शुद्धता निर्दिष्ट किया जाता है 6 महत्वपूर्ण आंकड़े लागू हो जाएगी। % .7 जी या बड़ा सभी वांछित फ्लोट देंगे।

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