使用swift格式化double的String

时间:2014-08-29 16:28:45

标签: ios swift

如何使用swift格式化double的字符串? 我正在制作像iOS上的基本计算器一样的计算器,我需要一个解决方案,根据点后面的字符数(总共不超过9位)更改显示的结果。

Example Table
|result   | wished displayed result | current displayed result
|         |                         |
|1.034    | 1.034                   | 1.03
|1.000567 | 1.000567                | 1.00
|1.2      | 1.2                     | 1.20

使用此代码:

result.text = String(format: "%.2f", displayNumber)

如果我得到1.000334,那么它只显示1.00

修改

我忘了说我不需要超过最多9个字符,包括点数。如果我删除%.2f我没有得到所需的结果,因为如果我得到1.323429249430003442,结果显示的结果将是1.323429249430003442,包含许多数字(不得超过9位,包括该点),否则添加%.9f是不好的,因为如果我得到1.32,结果显示的结果将是1.32000000,有很多不必要的零。

提前谢谢大家

编辑2(已解决):

如果有人将来服务,我就这样解决了:

var decimalNumberAsString = "\(resultNumber - floor(resultNumber))"
var decimalTrim: NSArray = decimalNumberAsString.componentsSeparatedByString(".")
numberOfDecimalPlaces = decimalTrim.objectAtIndex(1).length
if numberOfDecimalPlaces < 8 {
  numberOfDecimalPlaces = decimalTrim.objectAtIndex(1).length + 1
}
else {
  numberOfDecimalPlaces = 7
}
result.text = String(format: "%.\(numberOfDecimalPlaces)G", resultNumber)

2 个答案:

答案 0 :(得分:1)

这是因为您使用的是%.2f。删除所有浮动格式。它应该解决你的问题。

编辑 回复评论......

或者,如果您担心长度较长,请格式化为您想要的精度。假设您需要8的精度,比如说%.8f

答案 1 :(得分:0)

我省略了这样的显示限制: 导入基金会

extension String {
    func numberLongAsDisplay() -> String {
        let digitsToDisplay = 9
        let formatter = NumberFormatter()
        let number = NSNumber.init( value: Double(self)!)
        let digitsBeforeDot = (self.components(separatedBy: ".").first)!.count
       // let digitsAfterDot = (self.components(separatedBy: ".").last)!.count
        formatter.minimumFractionDigits = 0
        if digitsBeforeDot >= digitsToDisplay {
            formatter.maximumFractionDigits = 0
        } else {
            formatter.maximumFractionDigits = digitsToDisplay - digitsBeforeDot
        }

        return String(formatter.string(from: number) ?? "")
    }
}

使用示例:print ("88881.0567800111112234".numberLongAsDisplay())

\\result: 88881.0568 

还删除了不必要的零。