Swift:距离格式化

时间:2018-12-08 13:08:39

标签: ios swift

我需要将以米为单位的距离转换为公里。 例如,我有以下仪表表:

[10,100,5000,20000,180000,180500,1800000]

现在,我希望这些值以公里为单位,且整体至少3位数字。但前提是距离小于100公里。

[0,01; 0,10; 5,00; 20,0; 180; 180; 1800]

我已经尝试过使用NumberFormatter:

let numberFormatter = NumberFormatter()
numberFormatter.minimumIntegerDigits = 1
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2

我是否需要IF / ELSE,或者可以使用常规NumberFormatter来实现? 预先感谢。

2 个答案:

答案 0 :(得分:1)

也许这就是您想要的:

let a = [10, 100, 5_000, 20_000, 180_000, 180_500, 1_800_000]

let maxIntegerDigits = Int(log(Float80(Int.max)) + 1)

let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 1

let result: [String] = a.map { distance in
    let inKilometers = Double(distance) / 1000
    if distance < 10_000 {
        formatter.minimumFractionDigits = 2
        formatter.maximumFractionDigits = 2
        formatter.maximumIntegerDigits = 1
    }
    else if distance < 100_000 {
        formatter.minimumFractionDigits = 1
        formatter.maximumFractionDigits = 1
        formatter.maximumIntegerDigits = 2
    } else {
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = 0
        formatter.maximumIntegerDigits = maxIntegerDigits
    }
    return formatter.string(for: inKilometers) ?? ""
}

print(result)  //["0.01", "0.10", "5.00", "20.0", "180", "180", "1,800"]

您可以设置数字格式程序的区域设置,以更改分组和小数点分隔符。

答案 1 :(得分:0)

如果您要为此使用NumberFormatter,则可以创建一种方法,该方法返回所需的小数位数

private func getNumberOfFractionDigits(for number: Double) -> Int {
    switch self {
    case ..<10:
        return 2
    case ..<100:
        return 1
    default:
        return 0
    }
}

然后只需将格式化程序的maximumFractionDigits属性设置为getFractionDigits的结果即可得到您的数字除以千

let dividedNumber = yourNumber / 1000
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = getNumberOfFractionDigits(for: dividedNumber)
let formatedNumber = Double(numberFormatter.string(from: NSNumber(value: dividedNumber))!)!