【问题标题】:How to format decimal in Swift to percentage如何在 Swift 中将小数格式化为百分比
【发布时间】:2019-12-28 07:11:35
【问题描述】:

我有一个函数可以查找数组中相邻值的百分比差异。

var values =  [1.623,1.614,1.591,1.577,1.600,1.579,1.622]
values.reverse()
let percentages = [0] + zip(values, values.dropFirst()).map { (old, new) in
    return (100.0 * (new - old) / old)
}
print(percentages)

[0.0, -2.651048088779294, 1.3299556681444034, -1.4375000000000082, 0.8877615726062151, 1.445631678189826, 0.5576208178438598]

有没有办法可以将我的值格式化为如下所示

["+0.006%","+0.014%","+0.009%","-0.014%","+0.013%","-0.027%"]

【问题讨论】:

  • 使用NumberFormatter 并将numberStyle 设置为.percent

标签: ios swift string floating-point double


【解决方案1】:

只在地图闭包中返回字符串

let percentages = [0] + zip(values, values.dropFirst()).map {      (old, new) in     
    let value = (100.0 * (new - old) / old)  
    return String(format: "%.3f%%", value)
}

【讨论】:

    【解决方案2】:

    您可以以NumberFormatter 开头,例如...

    let formatter = NumberFormatter()
    formatter.numberStyle = .percent
    formatter.minimumIntegerDigits = 1
    formatter.maximumIntegerDigits = 1
    formatter.maximumFractionDigits = 3
    
    var values =  [1.623,1.614,1.591,1.577,1.600,1.579,1.622]
    values.reverse()
    let percentages = [0] + zip(values, values.dropFirst()).map {
        (old, new) in
        return (100.0 * (new - old) / old)
    }
    
    print(percentages.compactMap { formatter.string(from: NSNumber(value: $0 / 100.0)) })
    

    它会打印出类似...的东西

    ["0%", "-2.651%", "1.33%", "-1.438%", "0.888%", "1.446%", "0.558%"]
    

    您的字符串仅显示负数的信号。这不是OP所要求的。

    ? 上天禁止 OP 实际上必须做“一些”工作??

    print(percentages.map { ($0 >= 0 ? "+" : "") + formatter.string(for: $0 / 100.0)! })
    

    或者,最好……

    formatter.positivePrefix = "+"
    //....
    print(percentages.compactMap { formatter.string(for: $0 / 100.0) })
    

    打印...

    ["+0%", "-2.651%", "+1.33%", "-1.438%", "+0.888%", "+1.446%", "+0.558%"]
    

    如果可能的话,您能否进一步解释一下如何伪造数字?

    值的格式似乎与您生成的值不匹配,例如,0.8877615726062151 将是 0.8%,而不是 0.009%,因此您需要进行轻微的自定义,最好通过“稍微捏造”这些值。

    所以,再次,从...开始

    let formatter = NumberFormatter()
    formatter.numberStyle = .percent
    formatter.minimumIntegerDigits = 1
    formatter.maximumIntegerDigits = 1
    formatter.maximumFractionDigits = 3
    formatter.minimumFractionDigits = 3
    formatter.positivePrefix = "+"
    

    我修改了

    print(percentages.compactMap { formatter.string(for: $0 / 100.0) })
    

    print(percentages.compactMap { formatter.string(for: $0 / 10000.0) })
    

    现在打印

    ["+0.000%", "-0.027%", "+0.013%", "-0.014%", "+0.009%", "+0.014%", "+0.006%"]
    

    根据我的观察,这似乎是您的目标 - 您只需免费获得本地化

    【讨论】:

    • 无需将您的浮点数转换为 NSNumber。您可以使用Formatters string(for: Any) 方法
    • @LeoDabus “您的字符串只显示负数的信号。” - 是的,但这是一个起点,必须让 OP 有所作为;)。也许只有我一个人,但是 "You can use Formatter string(for: Any) method" 过去对我不起作用(最近可能发生了变化,但我的旧代码是这样工作的)
    • 我很确定它有效。只需将from 更改为for
    • @LeoDabus 可能是这样,正如我所说,它不适合我过去,所以我只是复制并粘贴它;)
    • 即使这接近答案,核心是将值完善到0.009 而不是0.888
    【解决方案3】:
    [0.0, -2.651048088779294, 1.3299556681444034, -1.4375000000000082, 0.8877615726062151, 1.445631678189826, 0.5576208178438598]
    .map{String(format:"%+6.3f%%",$0/100)}
    

    这个将提供 +/- 符号。

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2020-10-27
      • 2019-07-03
      相关资源
      最近更新 更多