1

私はこれに2日間取り組んできました。スタックオーバーフローを参照する時間です。

小数点とグループ区切り記号を選択できる iOS ユーザー設定があります。区切り記号が小数点の場合は完全に機能しますが、小数点のコンマに設定すると、すべての数値エントリが自動的に最も近い整数に丸められ、計算の精度が失われます。

スキームは次のとおりです。

//Use formatter to set decimal style for output
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:1];
[formatter setMaximumFractionDigits:5];

//Set number format from preferences
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *numberFormat = [userDefaults stringForKey:kNumberFormat];
if([numberFormat isEqualToString:@"Decimal Point"])
    {
    [formatter setDecimalSeparator:@"."];
    [formatter setGroupingSeparator:@","];
    }

    else
    {
    [formatter setDecimalSeparator:@","];
    [formatter setGroupingSeparator:@"."];
    }

NSNumber *number = [NSNumber numberWithDouble: result];
NSString* formattedResult = [formatter stringFromNumber:number];
[display_ setText: [NSString stringWithFormat:@"%@", formattedResult]];
[formatter release];

小数点区切りモードでは 5.5 + 5.5 = 11.0

ただし、コンマ区切りモードでは、5.5 は表示ですぐに 5.0 に切り捨てられ、5.5 + 5.5 = 10 になります。

私が欲しいものではありません!

4

1 に答える 1

1

私は自分でそれを理解することができました。数値フォーマッタは正しく動作していました。アナライザー クラスを機能させるには、カンマの小数点記号を含むことができない double を送信する必要がありました。しかし、コンマ区切りモードで表示を正しく表示するには、文字列を目的の形式 (たとえば 2.500,05) でディスプレイに送信し、必要に応じて小数点とコンマを使用して文字列を再フォーマットし、その文字列をに送信する必要がありました。 double としてのアナライザー (例: 2,500.05)。基本的に小数点とコンマを交換しているので、少し注意が必要です。おそらくそれを行うためのより洗練された方法がありますが、これはうまくいきました:

NSString *numberFormat = [userDefaults stringForKey:kNumberFormat];

//if the string has been entered using a decimal comma, do this
if([numberFormat isEqualToString:@"Decimal Comma"])
{

 NSString *displayString = [display_ text];
 NSString *newStringValue = [displayString 
           stringByReplacingOccurrencesOfString:@"," withString:@"x"];
 newStringValue = [newStringValue 
           stringByReplacingOccurrencesOfString:@"." withString:@","];
 newStringValue = [newStringValue 
           stringByReplacingOccurrencesOfString:@"x" withString:@"."];
 [display_ setText:displayString];
 [[self analyzer_] setFirstOperand:[newStringValue doubleValue]];
}

//there is no problem if the decimal separator is a decimal point, so 
//just send it as is
if([numberFormat isEqualToString:@"Decimal Point"])

{   
 [[self analyzer_] setOperand:[[display_ text] doubleValue]];   
} 
于 2011-09-09T05:05:49.337 に答える