2012-08-16 51 views
5

用户将输入美元值作为int,我想将结果转换为缩短的格式化字符串。所以如果用户输入1700,字符串会说“$ 1.7k”。如果用户输入32600000,字符串将会说“$ 32.6m”。将int转换为缩短的格式化字符串

更新

这里是我到目前为止的代码。它似乎正在为数​​字〜10K工作。我只是添加更多的if语句为更大的数字。但是,有没有更有效的方法来做到这一点?

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

你可以做到这一点一个简单的if ... else if ... – Selkie 2012-08-16 19:09:16

+2

我相信你在问你的问题之前已经尝试了一些东西,但是你的代码没有工作。你可以请你尽最大努力吗? – dasblinkenlight 2012-08-16 19:09:53

+1

虽然你会如何得到小数点?即,将1700转换为1.7。我认为这就是我正在努力的。在将其转换为字符串之前将其分开? – bmueller 2012-08-16 19:12:53

回答

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); 

ARC本地化版本

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 2012-08-16 22:29:22

+0

我注意到一个问题 - 当指定的数字是'324,333'时,它输出'324.3k'。这是我想要适应这个空间的太多字符。在这个特定情况下,我怎样才能摆脱小数点后的所有内容? – bmueller 2012-08-17 18:16:50

+1

'。* f'中的星号('*')决定小数位数。查看我对字符串格式的更新以确保值<100(3个字符)。 – Joe 2012-08-17 18:46:23

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 2015-05-05 22:56:43