2

ユーザーが UILabel に数値文字列を入力すると、ユーザーが入力したテキストが表示されます。

NSString *input = [[sender titleLabel] text];
[display_ setText:[[display_ text] stringByAppendingString:input]];

これは正常に動作し、NSNumberFormatter を使用して表示をフォーマットし、1000000 を入力すると別のボタンをタップすると 1,000,000 に変換されるようにします。

ただし、これらのグループ化コンマをユーザーの種類として表示したいと思います。文字列に物を挿入する方法は理解できますが、ユーザーが入力する方法はわかりません。これには変更可能な文字列が必要ですか?

どうにかして文字列の長さを監視し、それを 3 つのグループに分割して、コンマが挿入された新しい文字列を作成して表示することはできますか? 私はおそらくそれを行うことができますが、私が困惑しているのは「入力されたとおり」の部分です。

もう 1 つの考えは、文字列を追加して表示し、表示を新しい NSString に読み込んでフォーマットし、すぐに再度表示することです。だから私はそれを試しました、そしてそれはほとんどうまくいきます:

 if (userIsEntering)    
{
NSNumberFormatter *fmtr = [[NSNumberFormatter alloc] init];
[fmtr setNumberStyle:NSNumberFormatterDecimalStyle];
[fmtr setGroupingSeparator:@","];
[fmtr setDecimalSeparator:@"."];

NSString *out = [[display_ text] stringByAppendingString:digit];
NSNumber *num = [fmtr numberFromString:out];
NSString* formattedResult = [fmtr stringFromNumber:num];

[display_ setText: [NSString stringWithFormat:@"%@", formattedResult]];

[fmtr release];
}

また、フォーマッタは数字が入力されるたびに作成および解放されるという事実とともに、4 桁の後に null を返します。

更新: ラベルでそれを行う方法を見つけました (@Michael-Frederick の助けを借りて)。NSNotification を使用します。

これは非 10 進数では完全に機能しますが、小数点を入力しようとすると無視されて削除されます。このメソッドを呼び出さない場合は、小数点が受け入れられ、すべて正常に機能します。

数値入力は次のとおりです (ボタンから)。

NSString *digit = [[sender titleLabel] text];
if (userIsStillWorking_)        
{
[display_ setText:[[display_ text] stringByAppendingString:digit]];
    }
else
{
[display_ setText: digit];
userIsStillWorking_ = YES;
    }
[[NSNotificationCenter defaultCenter] postNotificationName:@"updateDisplay" object:nil];

通知によって呼び出される updateDisplay メソッドは次のとおりです。

{
NSString *unformattedValue = [display_.text stringByReplacingOccurrencesOfString:
          @"," withString:@""];
unformattedValue = [unformattedValue stringByReplacingOccurrencesOfString:
          @"." withString:@""];
NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:unformattedValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setGroupingSeparator:@","];
[formatter setDecimalSeparator:@"."];
[display_ setText: [ formatter stringFromNumber:amount]];
[formatter release];
}

コメントアウトしてみました

unformattedValue = [unformattedValue stringByReplacingOccurrencesOfString:
                   @"." withString:@""];

しかし、それは違いはありません。

4

2 に答える 2

1

編集: ユーザーは uilabel に入力できません。uitextfield または uitextview のいずれかを使用する必要があります。

uitextfield を使用する場合は、次のようにします...

- (void) viewDidLoad {
[super viewDidLoad];
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}

- (void) textFieldDidChange:(UITextField *)textField {
    NSString *unformattedValue = [textField.text stringByReplacingOccurrencesOfString:@"," withString:@""];
    unformattedValue = [unformattedValue stringByReplacingOccurrencesOfString:@"." withString:@""];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [formatter setGroupingSeparator:@","];
    [formatter setDecimalSeparator:@"."];

    NSNumber *amount = [NSNumber numberWithInteger:[unformattedValue intValue]];
    textField.text = [formatter stringFromNumber:amount];

    [formatter release];
}

NSNumberFormatter は textFieldDidChange メソッドの外で宣言する必要があることに注意してください。このコードは実際には整数用であることに注意してください。必要に応じて、intValue を floatValue に切り替える必要があります。このコードはテストされておらず、一般的なガイドです。

于 2011-09-15T05:14:32.527 に答える