我有以下情况需要帮助解决。我有一个双倍,可以超过15位数,没有小数或可以有小数但不超过15位数。 以下是我需要满足的条件:
1.234567E10
。 e.g。如果该数字为123456.382
,则应将其格式化为123,456.882
。
如果号码为12345678901234567
,则应将其格式化为1.234567E16
。如果它有小数,则应忽略它们。
尝试使用格式说明符%1.6g
从double创建一个字符串。这适用于十进制数字,但一旦数字超过6位,例如100,000
,它变成科学记数法。我怎样才能达到预期的效果?
编辑:科学记数法的类型无关紧要。即我不关心它是...E10
还是...e+10
答案 0 :(得分:1)
如果双倍超过15位,包括小数,则应该转 6位精度的科学记数法。
您的意思是总是6个小数位,但如果整数部分超过9位数,那么请使用科学记数法吗?如果是这样,那么这就是我的解决方案。
NSString *numberToString(NSNumber *number) {
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
// If number has (15 - 6) or less integer digits
if ([number integerValue] < 1E9) {
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setUsesGroupingSeparator:YES];
} else {
[formatter setNumberStyle:NSNumberFormatterScientificStyle];
}
[formatter setMinimumFractionDigits:6];
[formatter setMaximumFractionDigits:6];
return [formatter stringFromNumber:number];
}
答案 1 :(得分:0)
我不确定这是否是最好的方法,但确实有效:
if ([[num stringValue] rangeOfString:@"e"].location == NSNotFound) {
formatter.numberStyle = NSNumberFormatterDecimalStyle;
NSLog(@"%@", [formatter stringFromNumber:num]);
} else {
formatter.positiveFormat = @"0.000000E0";
formatter.roundingMode = NSNumberFormatterRoundDown;
NSLog(@"%@", [formatter stringFromNumber:num]);
}
如果num = NSNumber *num = [NSNumber numberWithDouble:12345678901234567];
将返回:1.234567E16
如果num = NSNumber *num = [NSNumber numberWithDouble:123456.382];
将返回:123,456.382