【发布时间】:2011-05-04 19:51:05
【问题描述】:
我正在为 iPad 开发应用程序。我想知道如何确定一个字符串是否可以转换为双精度。例如,NSNumberFormatter 的 [myString floatValue] 和 numberFromString 方法都将“123rrrrr”之类的字符串识别为有效数字,并返回其数字部分,即 123!
你能帮帮我吗?
【问题讨论】:
标签: objective-c ios4
我正在为 iPad 开发应用程序。我想知道如何确定一个字符串是否可以转换为双精度。例如,NSNumberFormatter 的 [myString floatValue] 和 numberFromString 方法都将“123rrrrr”之类的字符串识别为有效数字,并返回其数字部分,即 123!
你能帮帮我吗?
【问题讨论】:
标签: objective-c ios4
您可以将 NSScanner 用于这些目的。它具有从字符串中过滤浮点数和双精度数的方法。
【讨论】:
NSNumberFormatter 方法 getObjectValue:forString:range:error 会做你想做的事。这将解析字符串给定范围内的数字 - 将其设置为整个字符串 - 并返回它使用的字符串的范围 - 如果此范围没有扩展到字符串的末尾,则数字后面有垃圾。
这是一个简单的包装器:
- (BOOL) getNumberValue:(out NSNumber **)parsedNumber
forString:(NSString *)inputString
error:(out NSError **)error
{
NSNumberFormatter *parser = [NSNumberFormatter new];
// remove whitespace so we can easily test if the whole string was parsed OK
NSString *trimmed = [inputString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSUInteger trimmedLength = [trimmed length];
NSRange all = NSMakeRange(0, trimmedLength);
BOOL status = [parser getObjectValue:parsedNumber forString:trimmed range:&all error:error];
if(status && all.length != trimmedLength)
{ // getObjectValue succeeded but garbage after number (if garbage before number getObjectValue will fail)
if (error != NULL)
{ // make appropriate error
*error = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSFormattingError
userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"The value “%@” is invalid.", inputString]
forKey:NSLocalizedDescriptionKey]];
}
status = NO;
}
return status;
}
【讨论】: