2012-03-24 10 views
4

NSMutableStringインスタンスに格納されている数値をカンマ区切り文字で自動書式設定し、その結果をUITextFieldに表示します。コンマ区切りの数字を含む文字列の書式設定

NSNumberFormatterを通貨としてフォーマットしようとしましたが、元のNSMutableStringに小数点以下の桁が含まれていない場合は小数点以下を表示しません。例えば

  • NSMutableStringは "1234567" が含まれている場合、それは "1234567" としてフォーマットする必要があります。
  • NSMutableStringは「1234567.1」が含まれている場合、それはNSMutableStringは「1234567.12」が含まれている場合、それは「1,234,567.12」

ようNSMutableStringが含まれていることの最大小数をフォーマットする必要があります「1,234,567.1」

  • としてフォーマットする必要があります2です。

    何か助けていただければ幸いです。

    ありがとうございます!

  • 答えて

    6

    あなたはしかし、ここで、この上のユーザーと対話している場合は、あなたが本当にこれをローカライズする必要があることに注意してくださいそれを行うための一つの方法である:

    - (NSString *)formatString:(NSString *)string { 
        // Strip out the commas that may already be here: 
        NSString *newString = [string stringByReplacingOccurrencesOfString:@"," withString:@""]; 
        if ([newString length] == 0) { 
         return nil; 
        } 
    
        // Check for illegal characters 
        NSCharacterSet *disallowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"."] invertedSet]; 
        NSRange charRange = [newString rangeOfCharacterFromSet:disallowedCharacters]; 
        if (charRange.location != NSNotFound) { 
         return nil; 
        } 
    
        // Split the string into the integer and decimal portions 
        NSArray *numberArray = [newString componentsSeparatedByString:@"."]; 
        if ([numberArray count] > 2) { 
         // There is more than one decimal point 
         return nil; 
        } 
    
        // Get the integer 
        NSString *integer   = [numberArray objectAtIndex:0]; 
        NSUInteger integerDigits = [integer length]; 
        if (integerDigits == 0) { 
         return nil; 
        } 
    
        // Format the integer. 
        // You can do this by first converting to a number and then back to a string, 
        // but I would rather keep it as a string instead of doing the double conversion. 
        // If performance is critical, I would convert this to a C string to do the formatting. 
        NSMutableString *formattedString = [[NSMutableString alloc] init]; 
        if (integerDigits < 4) { 
         [formattedString appendString:integer]; 
        } else { 
         // integer is 4 or more digits 
         NSUInteger startingDigits = integerDigits % 3; 
         if (startingDigits == 0) { 
          startingDigits = 3; 
         } 
         [formattedString setString:[integer substringToIndex:startingDigits]]; 
         for (NSUInteger index = startingDigits; index < integerDigits; index = index + 3) { 
          [formattedString appendFormat:@",%@", [integer substringWithRange:NSMakeRange(index, 3)]]; 
         } 
        } 
    
        // Add the decimal portion if there 
        if ([numberArray count] == 2) { 
         [formattedString appendString:@"."]; 
         NSString *decimal = [numberArray objectAtIndex:1]; 
         if ([decimal length] > 0) { 
          [formattedString appendString:decimal]; 
         } 
        } 
    
        return formattedString; 
    } 
    
    // Test cases: 
    NSLog(@"%@", [self formatString:@"123456"]); 
    NSLog(@"%@", [self formatString:@"1234567."]); 
    NSLog(@"%@", [self formatString:@"12345678.1"]); 
    NSLog(@"%@", [self formatString:@"123456789.12"]); 
    
    // Output: 
    123,456 
    1,234,567. 
    12,345,678.1 
    123,456,789.12 
    
    +0

    うわー、ありがとう!それは完璧に働いた。私は再ローカリゼーションに同意しますが、このアプリは特定の国向けであるため、ハードコードされた形式を使用しています。 – staticnz

    0

    あなたはNSNumberFormatterで-setMinimumFractionDigits:メソッドを探しています。 0に設定すると、後に置くものがあれば小数点のみが表示されます。

    +0

    ありがとうございました。これを試してみましたが、ほとんど動作しています。それは私を混乱させるいくつかの問題があります。 文字列に "1234"が含まれていると、 "1234"のみが表示されるため、ユーザーは小数点キーが押されたことを認識しません。 文字列の長さが9文字の場合、フォーマッタはフォーマット時に番号を変更します。たとえば、123456789と入力すると、 '123,456,792'とフォーマットされます - これがどうして起こっているのでしょうか? 9文字未満の場合、問題なく入力されます。 – staticnz

    +0

    これは私のコードです: '// Create Formatter NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; [フォーマッタsetNumberStyle:NSNumberFormatterDecimalStyle]; [フォーマッタsetMinimumFractionDigits:0]; [フォーマッタsetGroupingSeparator:@ "、"]; entryFieldFloat = [entryField doubleValue]; NSNumber * entryFieldNumber = [NSNumber numberWithDouble:entryFieldFloat]; [enterPrice setText:[NSString stringWithFormat:@ "%@"、[フォーマッタstringFromNumber:entryFieldNumber]]] ' – staticnz

    0

    私はこれを行うべきだと思う - 私は値を入力する小数点があるかどうかをチェックするif文を追加しました。この例の「出力」は、結果を示すためにテキストフィールドの値にバインドしたプロパティです。

    -(IBAction)doConversion:(id)sender{ 
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init]; 
        [formatter setMaximumFractionDigits:2]; 
        [formatter setUsesGroupingSeparator:YES]; 
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    
        double entryFieldFloat = [entryField doubleValue]; 
        if ([entryField.stringValue rangeOfString:@"."].length == 1) { 
         formatter.alwaysShowsDecimalSeparator = YES; 
         self.output =[formatter stringFromNumber:[NSNumber numberWithDouble:entryFieldFloat]]; 
        }else{ 
         formatter.alwaysShowsDecimalSeparator = NO; 
         self.output =[formatter stringFromNumber:[NSNumber numberWithDouble:entryFieldFloat]]; 
        } 
    } 
    
    1

    ただシンプルに、このメソッドを呼び出します。

    public static String GetCommaSeparatedCount(this Int32 Count) 
        { 
         // Check for The less-than character (<) is converted to &lt; 
         String result = String.Format("{0:#,##0}", Count); 
    
         return result; 
        } 
    
    関連する問題