2012-08-16 18 views
5

उपयोगकर्ता को int के रूप में एक डॉलर मूल्य दर्ज करेगा, और मैं परिणाम को एक छोटी, स्वरूपित स्ट्रिंग में परिवर्तित करना चाहता हूं। तो यदि उपयोगकर्ता 1700 में प्रवेश करता है, तो स्ट्रिंग "$ 1.7k" कहती है। यदि उपयोगकर्ता 32600000 में प्रवेश करता है, तो स्ट्रिंग "$ 32.6m" कहती है।int को छोटा, स्वरूपित स्ट्रिंग

अद्यतन

यहाँ कोड मैं अब तक राशि है। ऐसा लगता है कि संख्या ~ 10k के लिए काम कर रहा है। बड़ी संख्या के लिए बयान अगर मैं और अधिक जोड़ दूंगा। लेकिन क्या ऐसा करने का एक और अधिक प्रभावी तरीका है?

NSNumberFormatter *nformat = [[NSNumberFormatter alloc] init]; 
[nformat setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
[nformat setCurrencySymbol:@"$"]; 
[nformat setNumberStyle:NSNumberFormatterCurrencyStyle]; 
double doubleValue = 10200; 
NSString *stringValue = nil; 
NSArray *abbrevations = [NSArray arrayWithObjects:@"k", @"m", @"b", @"t", nil] ; 

for (NSString *s in abbrevations) 
{ 

    doubleValue /= 1000.0 ; 

    if (doubleValue < 1000.0) 
    { 

     if ((long long)doubleValue % (long long) 100 == 0) { 
      [nformat setMaximumFractionDigits:0]; 
     } else {     
      [nformat setMaximumFractionDigits:2]; 
     } 

     stringValue = [NSString stringWithFormat: @"%@", [nformat stringFromNumber: [NSNumber numberWithDouble: doubleValue]] ]; 
     NSUInteger stringLen = [stringValue length]; 

     if ([stringValue hasSuffix:@".00"]) 
     {     
      // Remove suffix 
      stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-3)];    
     } else if ([stringValue hasSuffix:@".0"]) { 

      // Remove suffix 
      stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-2)]; 

     } else if ([stringValue hasSuffix:@"0"]) { 

      // Remove suffix 
      stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-1)];   
     } 


     // Add the letter suffix at the end of it 
     stringValue = [stringValue stringByAppendingString: s]; 

     //stringValue = [NSString stringWithFormat: @"%@%@", [nformat stringFromNumber: [NSNumber numberWithDouble: doubleValue]] , s] ; 
     break ; 
    }  
} 

NSLog(@"Cash = %@", stringValue); 
+1

आप के साथ यह कर सकते हैं एक साधारण अगर ... और अगर ... – Selkie

+2

मुझे यकीन है कि आपने अपना प्रश्न पूछने से पहले कुछ करने की कोशिश की है, लेकिन आपका कोड काम नहीं करता है। क्या आप अपना सर्वश्रेष्ठ प्रयास पोस्ट कर सकते हैं? – dasblinkenlight

+1

हालांकि, आप दशमलव बिंदु कैसे प्राप्त करेंगे? यानी, 1700 से 1.7 रूपांतरित कर रहा है। मुझे लगता है कि मैं यही संघर्ष कर रहा हूं। इसे स्ट्रिंग में बदलने से पहले इसे विभाजित करें? – bmueller

उत्तर

14
unsigned long long value = 1700llu; 
//value = 32600001llu; 
//value = UINT64_MAX; 

NSUInteger index = 0; 
double dvalue = (double)value; 
//Updated to use correct SI Symbol (http://en.wikipedia.org/wiki/SI_prefix) 
NSArray *suffix = @[ @"", @"k", @"M", @"G", @"T", @"P", @"E" ]; 

while ((value/=1000) && ++index) dvalue /= 1000; 

NSString *svalue = [NSString stringWithFormat:@"$%.*f%@", 
        //Use boolean as 0 or 1 for precision 
        (int)(dvalue < 100.0 && ((unsigned)((dvalue - (unsigned)dvalue) * 10) > 0)), 
        dvalue, [suffix objectAtIndex:index]]; 
NSLog(@"Value: %@", svalue); 

एआरसी स्थानीय संस्करण

unsigned long long value = 1700llu; 
//value = 32600001llu; 
//value = UINT64_MAX; 

NSUInteger index = 0; 
double dvalue = (double)value; 
//Updated to use correct SI Symbol (http://en.wikipedia.org/wiki/SI_prefix) 
NSArray *suffix = @[ @"", @"k", @"M", @"G", @"T", @"P", @"E" ]; 

while ((value/=1000) && ++index) dvalue /= 1000; 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
//Germany Example 
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de-de"]]; 
//Set fractional digits to 0 or 1 
[formatter setMaximumFractionDigits:(int)(dvalue < 100.0 && ((unsigned)((dvalue - (unsigned)dvalue) * 10) > 0))]; 

NSString *svalue = [[formatter stringFromNumber:[NSNumber numberWithFloat:dvalue]] 
        stringByAppendingString:[suffix objectAtIndex:index]]; 

NSLog(@"Value: %@", svalue); 
+1

वाह, यह पूरी तरह से काम करता है। आप, श्रीमान, सज्जन और विद्वान हैं! – bmueller

+0

मैंने एक मुद्दा देखा - जब निर्दिष्ट संख्या है, तो कहें, '324,333', यह' 324.3k' आउटपुट करता है। यह उस स्थान के लिए एक बहुत अधिक वर्ण है जिसे मैं फिट करने की कोशिश कर रहा हूं। इस विशिष्ट मामले में दशमलव के बाद मैं सब कुछ कैसे छुटकारा पा सकता हूं? – bmueller

+1

'। * F' में स्टार (' * ') आंशिक अंकों की संख्या निर्धारित करता है। यह सुनिश्चित करने के लिए कि मान <100 (3 वर्ण) है, स्ट्रिंग प्रारूप में मेरा अपडेट देखें। – Joe

7

आप स्वत: समायोज्य चौड़ाई के साथ एक स्ट्रिंग चाहते हैं तो आप उपयोग कर सकते हैं:

+(NSString*)numberWithShortcut:(NSNumber*)number 
{ 
    unsigned long long value = [number longLongValue]; 

    NSUInteger index = 0; 
    double dvalue = (double)value; 

    NSArray *suffix = @[ @"", @"K", @"M", @"B", @"T", @"P", @"E" ]; 

    while ((value /= 1000) && ++index) dvalue /= 1000; 

    NSString *svalue = [NSString stringWithFormat:@"%@%@",[NSNumber numberWithDouble:dvalue], [suffix objectAtIndex:index]]; 

    return svalue; 
} 
+0

धन्यवाद। अच्छा साफ संस्करण। मुझें यह पसंद है। – mylogon

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