NSScanner如何期望用于扫描NSDecimal的字符串?

时间:2009-08-27 12:11:26

标签: iphone cocoa-touch uikit

在Brad的CorePlot中,我看到了这个片段,它消除了对一些咖啡的需求。我现在完全清醒了:

NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
[theScanner scanDecimal:&result];

Apple说:

  

扫描程序的语言环境会影响它的方式   解释字符串中的值。在   特别是,扫描仪使用   locale的小数分隔符   区分整数和小数   部分浮点数   表示。一个新的扫描仪   locale默认为nil,这会导致   它使用非本地化的值。

所以:如果我创建了一个NSScanner实例并且没有提供语言环境,它会期望字符串表示的十进制值就像我在普通源代码中键入它一样吗?

即。 @“ - 59933845504572.944882211”或@“123.456789”或@“145.002e33”或@“145.002e-33”?这是对的吗?

1 个答案:

答案 0 :(得分:0)

NSScanner将从字符串中提取数值,方法与使用该字符串初始化NSDecimalNumber的方式相同。您可以按照NSDecimalNumber的规则来解析它可以解析的内容。

根据Apple的“Cocoa字符串编程指南”的scanners section,本地化将基于用户的语言环境。您可以使用setLocale更改此设置:如果您想手动提供小数分隔符。

我们使用NSScanner从字符串初始化NSDecimal,因为它比使用NSDecimalNumber快得多,代码如下:

NSDecimalNumber *newNumber = [[NSDecimalNumber alloc] initWithString:@"1.0" locale:[NSLocale currentLocale]];
newDecimal = [newNumber decimalValue];
[newNumber release];

NSScanner每秒进行大约582000次转换,其中NSDecimalNumber仅在我的Mac上执行了307000次。