这里我使用NSNumberFormater
将double中的最大小数设置为2。它似乎工作正常,但是当我尝试将其转换为double时,从NSNumberFormater
生成的字符串,如NSLog
输出中所示,任何小数都被删除并替换为尾随零。这是为什么?
- (double)randomDoubleBetween:(double)smallNumber and:(double)bigNumber {
double diff = bigNumber - smallNumber;
double ranNum = (((double) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;
NSNumberFormatter *doubleValueWithMaxDecimalDigits = [[NSNumberFormatter alloc] init];
[doubleValueWithMaxDecimalDigits setNumberStyle:NSNumberFormatterDecimalStyle];
[doubleValueWithMaxDecimalDigits setMaximumFractionDigits:2];
NSNumber *num = [NSNumber numberWithDouble:ranNum];
NSString *valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num];
NSLog(@"String value %@", valueToReturn);
NSLog(@"Double value converted from string %f", [valueToReturn doubleValue]);
return [valueToReturn doubleValue];
}
NSLog输出:
2013-08-09 02:25:05.031 GG [27947:907]字符串值176,19
2013-08-09 02:25:05.035 GG [27947:907]从字符串176.000000转换的双倍值
答案 0 :(得分:4)
看起来-[NSString doubleValue]
不尊重区域设置小数分隔符;它需要一个点,而不是逗号。
// US uses point as decimal separator
[doubleValueWithMaxDecimalDigits setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]];
NSString *valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num];
// Correctly includes fractional part
NSLog(@"Double value converted from string %lf", [valueToReturn doubleValue]);
// Italy uses a comma
[doubleValueWithMaxDecimalDigits setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"it_IT"]];
valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num];
// Drops fractional part
NSLog(@"Double value converted from string %lf", [valueToReturn doubleValue]);
我不确定为什么要将数字格式化为您不使用的字符串,但是如果您要继续这样做,请再次使用相同的格式化程序将字符串解析为{{ 1}}在返回之前。
(除此之外,您的格式说明符错误;对double
使用%lf
。)