Ios 为什么NumberFormatter';s字符串(从:)是否返回可选值?
为什么Ios 为什么NumberFormatter';s字符串(从:)是否返回可选值?,ios,swift,Ios,Swift,为什么NumberFormatter函数func string(从编号:NSNumber)->string?返回的是字符串而不是字符串?NumberFormatter是否有特定的输入或状态,该函数可以返回nil?有时我听说这些不太理想的返回类型来自Objective-C延期文件,这是其中之一吗?有一个古老的(2002年)回答可能部分回答了您的问题: 奇怪的行为不是NSNumber——NSNumber-stringValue似乎返回了人们期望的结果。返回异常结果的是NSNumberFormatte
NumberFormatter
函数func string(从编号:NSNumber)->string?
返回的是字符串而不是字符串
?NumberFormatter
是否有特定的输入或状态,该函数可以返回nil?有时我听说这些不太理想的返回类型来自Objective-C延期文件,这是其中之一吗?有一个古老的(2002年)回答可能部分回答了您的问题:
奇怪的行为不是NSNumber——NSNumber-stringValue似乎返回了人们期望的结果。返回异常结果的是NSNumberFormatter
这里的抽象问题是,NSNumberFormatter最初是为了处理EOF的金额而编写的,因此它不能很好地处理异常数字(或通用字符串格式)
更具体的问题是,当您向NSNumberFormatter请求-stringForObjectValue:,如果对象不是NSDecimalNumber,它会使用
[NSDecimalNumber decimalNumberWithString:[objectValue stringValue]]
除了潜在的其他问题外,它不会很好地处理异常值。另一个问题,虽然我不知道是这样的,但我不认为有正反无限的NSDecimal(结构)表示,就像NaN一样
实际上,我不太理解这个响应,不足以说明这就是返回可选项的原因,但我怀疑它与此相关
原始问题中有示例代码,但没有一个返回nil
,它总是给出一个字符串。只是为了好玩:下面是一个(构造的,不是真实世界的)示例,其中
string(from:)
实际返回nil
:
let num = NSNumber(bytes: UnsafeRawPointer(bitPattern: 1)!, objCType: "v")
print(num) // <>
let fmt = NumberFormatter()
fmt.numberStyle = .decimal
let str = fmt.string(from: num)
print(str as Any) // nil
let num=NSNumber(字节:UnsafeRawPointer(位模式:1)!,对象类型:“v”)
打印(数字)//
设fmt=NumberFormatter()
fmt.numberStyle=.decimal
让str=fmt.string(from:num)
打印(str作为任意项)//nil
原因是此num
不代表数字:它是创建的
使用NSValue
(从中继承)初始值设定项
用一个值表示无效
。(“v”表示无效
,
指针值是不相关的。)我认为可以这样说,如果您尝试使用NumberFormatter将公共类型(如Double)格式化为字符串,它将无法返回nil
在我看来,这是为数不多的强制展开选项具有完美意义的情况之一
func formatToDecimalNumber(_ value: Double) -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2
formatter.locale = Locale.current
return formatter.string(from: NSNumber(value: value))!
}
相关:@vadian谢谢。我想,实际上,我在这里是想问,我是否可以凭良心随时打开这些声明,而这篇文章让我倾向于“是”。@vadian:事实上,这是相同的问题。(答案并不完全令人满意。)@Martin这就是为什么我没有将其标记为重复最相关的部分似乎是“当您向NSNumberFormatter询问-stringForObjectValue:,如果对象不是NSDecimalNumber,它将使用[NSDecimalNumber DecimalNumber WithString:[objectValue stringValue]将其转换为NSDecimalNumber”]这不会很好地处理异常值”。这听起来像是有一个实现细节,可能导致Obj-C用例中的空值,但不是Swift。感谢您的挖掘!这是一个比我预想的更有趣的答案。干杯,这是一个有趣的问题。也许苹果的一些工程师对NaN是否应该为零有过争论,他们妥协了一个可选值。你怎么知道这些?!尼斯:)