来自NSString的doubleValue,小数被删除

时间:2013-08-09 00:30:22

标签: objective-c nsstring nsnumberformatter

这里我使用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转换的双倍值

1 个答案:

答案 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。)