【问题标题】:Sum only the numbers in String - Swift仅对字符串中的数字求和 - Swift
【发布时间】:2021-03-13 18:14:22
【问题描述】:

我有一个标签,它有数字、美元符号,我有一个 UIStepper 可以增加和减少数字。我面临的问题是它无法将数字与美元符号相加,而我想要的是将数字与美元符号相加。

import UIKit
import GMStepper

class ViewController: UIViewController {


@IBOutlet var stepper: GMStepper!
@IBOutlet var priceLabel: UILabel!
var price: Double = 5.500


override func viewDidLoad() {
    
    super.viewDidLoad()
    
    priceLabel.text = "5.5 $"
    
}


@IBAction func stepper(_ sender: Any) {
    
    let newValue =  price * stepper.value
    let priceS = String(format: "%.3f", newValue)
    priceLabel.text = "\(priceS) $"

   }
}

【问题讨论】:

  • 你想总结什么?代码在哪里?
  • 总和是什么意思?将所有不同的数字相加,还是只从字符串中提取值?
  • 您应该使用NumberFormatter 进行演示,并(理想情况下)使用Decimal 数字进行计算。
  • @Claudio 如果已经有价格变量,为什么 OP 会解析一个数字? OP 应该只是增加值或创建另一个变量

标签: arrays swift


【解决方案1】:

不确定您要达到什么目的,只需提取值或将字符串中的各个数字相加即可。因此,要提取数字(使用text 作为您要解析的字符串):

let value = Double(text.filter{"0123456789.".contains($0)})

投射到 Double 将提供一个选项,因此您需要根据自己的情况适当地处理它。如果它来自步进器,您也许可以安全地强制展开。

如果要对数字求和,可以使用类似的方法:

let sum = text.filter{"0123456789".contains($0)}.reduce(0){$0 + Int(String($1))!}```

【讨论】:

  • 不,不要从字符串中提取值。将值保留为数字,仅转换为 String 以显示它。这很愚蠢。此外,您可以使用NumberFormatter 解析带有货币的数字。
  • @sulthan 我认为您误读了这个问题。我读取数据的来源是标签中的字符串。考虑到所有格式化程序类的重量,我不会为了这么简单的事情实例化一个。
【解决方案2】:

首先,让我们将货币值正确转换为String。

第二件事是忘记尝试将String 用于任何事情。考虑格式化字符串是仅显示的。不要试图将它们转换为数字。相反,将必要的值保留为数字。

class ViewController: UIViewController {
   private lazy var formatter: NumberFormatter = {
       let numberFormatter = NumberFormatter()
       numberFormatter.locale = Locale(identifier: "en_US")
       numberFormatter.numberStyle = .currency
       numberFormatter.currencyCode = "USD"
       numberFormatter.minimumFractionDigits = 3
       numberFormatter.maximumFractionDigits = 3

       return numberFormatter
   }()

   var originalPrice: Double = 5.5
   private var price = originalPrice

   private func updateText() {
      priceLabel.text = formatter.string(for: price)
   }

   override func viewDidLoad() {
      super.viewDidLoad();

      updateText()
   }

   @IBAction func stepper(_ sender: Any) { 
      // do any calculation here using price and stepper.value
      price = originalPrice * stepper.value
      updateText()
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多