将 ObjC NSNumber 代码迁移到 Swift 并在显示数字时遇到问题。

Posted

技术标签:

【中文标题】将 ObjC NSNumber 代码迁移到 Swift 并在显示数字时遇到问题。【英文标题】:Migrating ObjC NSNumber code to Swift and having problems with displaying numbers. 【发布时间】:2015-11-13 14:18:30 【问题描述】:

我正在将我的 ObjC 应用程序迁移到 Swift 并遇到了一个特殊问题。

我的应用程序读取 JSON 文件并从中构建模型。从 JSON 读取的数字曾经分配给 NSNumber。一些数字是整数(例如 60),另一些则包含小数部分(例如 60.23)。

当我在我的应用程序中显示这些数字时,60 将是 60(不是 60.0)并且小数会正确显示。

现在我正在编写 Swift 代码并将从 JSON 读取的数字分配给 Double。即使我使用 let x=String(myDouble) 数字 60 也总是会出现 60.0

我不想要这个...但我不能只是格式化它 %f 因为我不知道这个数字是整数还是有小数部分。

我是否真的需要检查它是否是一个整体,然后使用它格式化它 %f?

我在 Swift 中遗漏了什么吗?到目前为止,ObjC 代码的行为符合我的要求,Swift 似乎给了我整数的小数。

【问题讨论】:

如果你想要 NSNumber 的行为,为什么要切换到 Double? 老实说,我只使用了 NSNumber,因为它更容易在 ObjC 中传递。 【参考方案1】:

你可以使用NSNumberFormatter

let number1 : Double = 60
let number2 = 60.23

let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .DecimalStyle
let number1String = numberFormatter.stringFromNumber(number1) // "60"
let number2String = numberFormatter.stringFromNumber(number2) // "60.23"

【讨论】:

您还可以设置最小和最大小数位数以进一步自定义显示。使用格式化程序的另一个好处是小数点分隔符已正确本地化。 并且数字格式化程序应该被缓存和重用,因为它的创建有点昂贵。 这可能对我有用。我会试一试。谢谢。【参考方案2】:

仅供参考,这是 PlayGround 中的代码:

let number = 60.23
String(number)

let double:Double = 60

//First way
String(NSNumberFormatter().stringFromNumber(double)!)


//Second way
let doubleString = String(double)

if doubleString.containsString(".0") 
    let length = doubleString.characters.count

    let index = doubleString.characters.indexOf(".")
    doubleString.substringToIndex(index!)

【讨论】:

在这个例子中,你如何确定第一个数字没有被转换为 int?

以上是关于将 ObjC NSNumber 代码迁移到 Swift 并在显示数字时遇到问题。的主要内容,如果未能解决你的问题,请参考以下文章

核心数据迁移丢失 NSNumber 值

Swift 3 迁移详解

IOS开发-ObjC-NSArray

将 NSNumber 转换为 long

JLink OB SWI 取代串口打印的方式

Swift系列三十 - 从OC到Swift