【问题标题】:NSNumberFormatter numberFromString decimal numberNSNumberFormatter numberFromString 十进制数
【发布时间】:2014-03-14 19:02:17
【问题描述】:

我正在尝试用NSNumberFormatter 解析NSString,如下所示。

NSNumberFormatter *myFormatter = [[[NSNumberFormatter alloc] init];
NSNumber *myNumber = [myFormatter numberFromString:@"42.00000"];

numberFromString 在模拟器中返回 NSNumber 对象,但不在设备上。

小数 (.00000) 导致设备上的返回值为 nil,因为解析 42(不带小数)可以正常工作(在模拟器和设备上)。

我使用 NSNumberFormatter 的原因是,如果字符串不是有效数字,它会如何返回nil(这对我不利:p)。 NSString doubleValue 不提供这种行为。此外,NSDecimalNumber decimalNumberWithString 也无法完成这项工作,因为 [NSDecimalNumber decimalNumberWithString:@"4a2.00000"] 返回 4。

任何想法为什么这不能在设备上工作?

是语言环境吗?我尝试设置myFormatter.numberStyle = NSNumberFormatterNoStyleNSNumberFormatterDecimalStyle,但没有任何改变。

【问题讨论】:

  • 解析42.00000仅在设备(或模拟器)的区域设置为使用句点作为小数分隔符的区域设置时才有效。

标签: ios objective-c cocoa-touch nsnumberformatter


【解决方案1】:

正如@rmaddy 在评论中所说,NSNumberFormatter 的小数分隔符是 取决于语言环境。如果您有固定的输入格式,以点作为小数分隔符, 您可以设置“POSIX 语言环境”:

NSNumberFormatter *myFormatter = [[NSNumberFormatter alloc] init];
[myFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
NSNumber *myNumber = [myFormatter numberFromString:@"42.00000"];

或者,您可以使用 NSScanner 解析双精度值,例如描述 这里:parsing NSString to Double

【讨论】:

  • 谢谢,那行得通,en_US_POSIX 和 en_US 有什么区别?
  • @user3250560:我不知道正式的定义,但在developer.apple.com/library/ios/qa/qa1480/_index.html(大约是日期,会出现类似的区域设置相关问题),它被描述为...“en_US_POSIX”,一种专门设计用于生成美国英语结果的语言环境,无论用户和系统偏好如何。 “en_US_POSIX”在时间上也是不变的(如果美国在未来的某个时候改变了它格式化日期的方式,“en_US”将改变以反映新的行为,但“en_US_POSIX”不会),并且在机器之间。 ..
【解决方案2】:

42.00000 不是字符串伴侣,为什么不是@"42.00000"

【讨论】:

  • 这是问题中的错字。 OP 声明它在模拟器中运行良好。
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2019-03-02
  • 2020-02-09
相关资源
最近更新 更多