3 に答える
実用的には、文字列を数値に解析する前にカンマを削除するだけで、機能するはずです。
NSString *s = [self.calDisplay.stringValue
stringByReplacingOccurrencesOfString:@"," withString:@""];
あなたを残して
- (IBAction)digitPressed:(NSButton *)sender {
if (userIsEnteringANumber) {
NSString *s = [self.calDisplay.stringValue stringByReplacingOccurrencesOfString:@"," withString:@""];
NSNumber *number = [formatter numberFromString:[s stringByAppendingString:sender.title]];
self.calDisplay.stringValue = [formatter stringFromNumber:number];
} else {
self.calDisplay.stringValue = sender.title;
userIsEnteringANumber = YES;
}
}
私はこれが起こると信じています:
あなたが持っている文字列は「2,569」です。これは2000程度です。千単位の区切り文字はコンマであるため、これは正常に機能します。
もう一度ボタンを押すと (例: 1)、文字列は "2,5691" になります。これは適切な数値ではありません。3 桁の区切り文字 (コンマ) が間違っているため、nil 数値になります。「25,691」は正しいですが、「2,5691」です。
これを試して:
- (IBAction)digitPressed:(NSButton *)sender {
if (userIsEnteringANumber) {
double previous = [[self.calDisplay.stringValue] doubleValue];
double pressed = [sender.title doubleValue];
NSNumber *number = [NSNumber numberWithDouble:previous*10+pressed];
self.calDisplay.stringValue = [formatter stringFromNumber:number];
}
else {
self.calDisplay.stringValue = sender.title;
userIsEnteringANumber = YES;
}
}
ここでフォーマッタに問題がないことを指摘するbogdansrcの回答を拡張するには、この (宿題?) 問題を解決する 1 つの方法として、ディスプレイに既に 2 倍として表示されている文字列に数字を入力できるようにします。次のようになります。
- (IBAction)digitPressed:(NSButton *)sender {
if (userIsEnteringANumber)
{
double previous = self.calDisplay.stringValue.doubleValue;
NSString* pressed = sender.title;
NSString* newNumber = [NSString stringWithFormat:@"%g%s", previous, pressed];
self.calDisplay.stringValue = [formatter stringFromNumber:[newNumber doubleValue]];
}
else
{
self.calDisplay.stringValue = sender.title;
userIsEnteringANumber = YES;
}
}
もちろん、これは実際には理想的なMVCではありません。コードはモデルを追跡するために View に依存しているためです。そうすることで、 260から 260.4 に移行する方法を提供したコード スニペットだけから知ることは困難です。小数のはずの状態になってから4を押すと。小数点以下はstringValueの最後の文字として表示および追跡されていますか? もしそうなら、「。」のために上記は壊れます。最後は迷子になります。そうでない場合、モデルは基本的に一部がビューに分散し、一部が別の状態にあるため、理想的ではありません。