索引超出范围,用于将大数字转换为带后缀的数字(百万,十亿......)

时间:2017-07-28 15:20:07

标签: swift xcode numbers

我是一名新的程序员,为iOS构建我的第一个增量游戏。我写了一个小函数来将我的大数字转换为带后缀的较小数字。

func numberConverter(_ number: Double) -> String {

    let intermediate = floor(log10(number)/3)
    let numberSuffix: [String] = ["K", "M", "B", "T", "Qa", "Qi", "Sx", "Sp", "Oc", "No", "Dc", "UDc", "DDc", "TDc", "QaDc"]
    let convertedNumber: String = "\(round(number / pow(10.0, intermediate * 3.0) * 1000) / 1000) \(numberSuffix[Int(intermediate) - 1])"

    return convertedNumber
}

当我进行转换时,我总是得到“索引超出范围”错误。

我已经尝试了很多不同的搜索,但直到现在还没有答案。

任何人都可以看看吗?非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

你必须解决边缘情况:

func numberConverter(_ number: Double) -> String {
    let numIntegerDigits: Int

    // for smaller numbers than the log10 won't really make sense
    // adding the abs(...) fixes handling of negative values
    if abs(number) < 1 {
        numIntegerDigits = 0
    } else {
        numIntegerDigits = Int(floor(log10(abs(number))))
    }

    let unitIndex = numIntegerDigits / 3
    let numberSuffixes: [String] = ["K", "M", "B", "T", "Qa", "Qi", "Sx", "Sp", "Oc", "No", "Dc", "UDc", "DDc", "TDc", "QaDc"]

    // you have to solve the case when there is no unit (all values < 1000)
    guard unitIndex > 0 else {
        return String(number)
    }

    let scaledNumber = round(number / pow(10.0, Double(numIntegerDigits)) * 1000) / 1000
    let unitSuffix = numberSuffixes[unitIndex - 1]

    return "\(scaledNumber) \(unitSuffix)"
}