【问题标题】:Swift playground - How to convert a string with comma to a string with decimalSwift Playground - 如何将带逗号的字符串转换为带小数的字符串
【发布时间】:2015-04-03 12:45:50
【问题描述】:

我是 Swift 世界的新手。

如何将带逗号的字符串转换为带小数的字符串?

代码使用点 (.) 可以正常工作

问题是当我使用逗号 (,) ... 时:var price

问题的根源是十进制法语键盘使用逗号(,)而不是点(。)

不知道如何使用 NSNumberFormattergeneratesDecimalNumbers 如果它是关键。有不止一种选择。

//The answer change if "2,25" or "2.25" is used.

var price      : String = "2,25"
var priceFloat = (price as NSString).floatValue

//I need to have 2.25 as answer.

var costString = String(format:"%.2f", priceFloat)

感谢您的宝贵时间和帮助!

【问题讨论】:

    标签: swift string comma swift-playground


    【解决方案1】:

    更新:Xcode 8.2.1 • Swift 3.0.2 您可以使用 NumberFormatter() 将字符串转换为数字。您只需要指定小数分隔符,如下所示:

    extension String {
        static let numberFormatter = NumberFormatter()
        var doubleValue: Double {
            String.numberFormatter.decimalSeparator = "."
            if let result =  String.numberFormatter.number(from: self) {
                return result.doubleValue
            } else {
                String.numberFormatter.decimalSeparator = ","
                if let result = String.numberFormatter.number(from: self) {
                    return result.doubleValue
                }
            }
            return 0
        }
    }
    
    
    "2.25".doubleValue // 2.25
    "2,25".doubleValue // 2.25
    
    let price = "2,25"
    let costString = String(format:"%.2f", price.doubleValue)   // "2.25"
    

    您还应该使用 NumberFormat 进行货币格式化,因此创建一个只读计算属性 currency 扩展 FloatingPoint 协议以从 String doubleValue 属性返回格式化字符串。

    extension NumberFormatter {
        convenience init(style: Style) {
            self.init()
            self.numberStyle = style
        }
    }
    extension Formatter {
        static let currency = NumberFormatter(style: .currency)
    }
    extension FloatingPoint {
        var currency: String {
            return Formatter.currency.string(for: self) ?? ""
        }
    }
    

    let costString = "2,25".doubleValue.currency   // "$2.25"
    

    Formatter.currency.locale = Locale(identifier: "en_US")
    "2222.25".doubleValue.currency    // "$2,222.25"
    "2222,25".doubleValue.currency    // "$2,222.25"
    
    Formatter.currency.locale = Locale(identifier: "pt_BR")
    "2222.25".doubleValue.currency    // "R$2.222,25"
    "2222,25".doubleValue.currency    // "R$2.222,25"
    

    【讨论】:

      【解决方案2】:

      你可以使用这个Swift 3

      let currentAmount = "2,50"
      
      currentAmount = currentAmount.replacingOccurrences(of: ",", with: ".")
      
      print(currentAmount) // "2.50\n"
      

      【讨论】:

      • 在 Swift 4.2 中仍然有效
      【解决方案3】:
      var price = "2,25"
      price = price.replacingOccurrences(of: ",", with: ".")
      var priceFloat = (price as NSString).floatValue
      

      【讨论】:

      • 你肯定有“。”和“,”在这里错误的方式?
      【解决方案4】:

      可以为空的扩展版本:

      extension String 
      {
          static let customNumberFormatter = NumberFormatter()
          var doubleValue: Double? {
              String.customNumberFormatter.decimalSeparator = "."
              if let result =  String.customNumberFormatter.number(from: self) {
                  return result.doubleValue
              } else {
                  String.customNumberFormatter.decimalSeparator = ","
                  if let result = String.customNumberFormatter.number(from: self) {
                      return result.doubleValue
                  }
              }
              return nil
          }
      }
      

      【讨论】:

        【解决方案5】:

        编辑:更新以使用当前版本的 Swift:

        let amount = "8,35"
        
        var counter: Int = 0
        var noCommaNumber: String!
        for var carattere in (amount) {
            if carattere == "," { carattere = "." }
            if counter != 0 { noCommaNumber = "\(noCommaNumber ?? "\(carattere)")" + "\(carattere)" } else { noCommaNumber = "\(carattere)" } // otherwise first record will always be nil
            counter += 1
        }
        
        let importo = Float(noCommaNumber)
        

        【讨论】:

          猜你喜欢
          • 2017-11-07
          • 2012-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-26
          相关资源
          最近更新 更多