十分な小数点以下の桁数だけが表示されるように、数値をフォーマットする簡単な方法 (たとえば、appendFormat を使用する場合) はありますか? たとえば、4.23100 は 4.231 と表示され、5.0000 は 5 と表示されます。
読んでくれてありがとう。
十分な小数点以下の桁数だけが表示されるように、数値をフォーマットする簡単な方法 (たとえば、appendFormat を使用する場合) はありますか? たとえば、4.23100 は 4.231 と表示され、5.0000 は 5 と表示されます。
読んでくれてありがとう。
%f の代わりに %g を使用
ダブル n = 1234.5678;
NSString str = [NSString stringWithFormat:@"number is %g", n];
適切な精度で %g を使用してください。
double number = 1234.123;
NSLog(@"Number equals: %.8g", number)
こちらで参照されているように、最大精度が指定されていない限り、%g 変換はデフォルトで有効数字 6 桁になります。%.7g 以上は、すべて目的のフロートを提供します。
元の値を浮動小数点数ではなく文字列として保存する場合、この質問は非常に理にかなっています。
のカテゴリを使用してこれを処理しますNSString
。
+ (NSString *) stringForNotANumber {
static NSString *singleton;
if (!singleton) singleton = @"NaN";
return singleton;
}
- (NSUInteger) numberOfDecimalPlaces {
NSString *strValue = self;
// If nil, return -1
if (!strValue) return -1;
// If non-numeric, return -1
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setMaximumFractionDigits:128];
NSNumber *numValue = [f numberFromString:strValue];
if (!numValue) return -1;
// Count digits after decimal point in original input
NSRange range = [strValue rangeOfString:@"."];
if (NSNotFound == range.location) return 0;
return [strValue substringFromIndex:range.location+1].length;
}
- (NSString *) plus:(NSString *) addend1 {
NSString *addend2 = self;
if (!addend1 || !addend2) return nil;
if (addend1 == [NSString stringForNotANumber] ||
addend2 == [NSString stringForNotANumber])
return [NSString stringForNotANumber];
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
NSNumber *num1 = [f numberFromString:addend1];
NSNumber *num2 = [f numberFromString:addend2];
if (!num1 || !num2) return [NSString stringForNotANumber];
double sum = num1.doubleValue + num2.doubleValue;
[f setMinimumFractionDigits:MAX(addend1.numberOfDecimalPlaces,
addend2.numberOfDecimalPlaces)];
return [f stringFromNumber:[NSNumber numberWithDouble:sum]];
}
最初はこれを行う組み込みの方法を見つけることができなかったので、誰かが興味を持っている場合は、簡単な関数 (以下) を作成しました。そうは言っても、%g (MSgambel に感謝、Roger Gilbrat に感謝) と NSNumberFormatter クラス (Inafziger に感謝、David Nedrow に感謝) はこれをはるかに簡潔に行うと信じているので、おそらくより良い選択肢です!
+ (NSString *)trimmedFraction:(float)fraction{
int i=0;
float numDiff=0;
// Loop through possible decimal values (in this case, maximum of 6)
for (i=0;i<=6;i++){
// Calculate difference between fraction and rounded fraction
numDiff=round(fraction*pow(10,i))/pow(10,i)-fraction;
// Check if difference is less than half of the smallest possible value
if (fabsf(numDiff)<(0.5*pow(10,-6))){
break;
}
}
// Return string of truncated fraction
NSString *stringPattern=[NSString stringWithFormat:@"%%0.%df",i];
return [NSString stringWithFormat:stringPattern,fraction];
}
コードでは、小数点以下のスペースの最大数を指定できます (たとえば、この場合は 6)。次に、分数を送信するだけで、関連する小数のみを含む文字列が返されます。たとえば、4.231000 を送信すると @"4.231" が返され、5.000000 を送信すると @"5" が返されます。(繰り返しますが、おそらく %g と NSNumberWithFormatter を使用する方がよいでしょう)。