2012-08-16 18 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

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

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

+0

私は1つの問題に気付きました。指定された番号が、例えば、 '324,333'である場合、' 324.3k'を出力します。これは私がこれに収まるようにしようとしているスペースのためにあまりにも多くの文字です。この特定のケースでは、どうすれば10進数の後にすべてを取り除くことができますか? – 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

関連する問題