【问题标题】:add comma to string integers in swift [closed]在swift中将逗号添加到字符串整数[关闭]
【发布时间】:2019-05-25 13:44:02
【问题描述】:

好吧,看了一段时间后,我无法找到合适的答案来解决我的问题。

我有包含产品 pricez 数字的字符串。例如 1000、500 或 50。我希望将它们转换为 2 位小数:10.00、5.00 和 0.50

我怎样才能做到这一点,这是否也可以在不将它们转换为 int 或 float 以保留字符串的情况下实现?

【问题讨论】:

  • 这个问题可能需要一些改进:当您似乎想要添加小数点时,标题会显示“添加逗号”;当(考虑到您的回答)您的意思似乎是“返回一个字符串”时,您专门说“不将它们转换为 int 或 floats”。
  • 当您询问“不将它们转换为”数字类型时,实际情况是这正是您应该做的。然后您就可以享受NumberFormatter 的全部力量。本地化结果、小数分隔符、千位/分组分隔符等。虽然这个问题看起来像“只需插入一个.”,但它比这更复杂,NumberFormatter 是解决所有这些问题的一个很好、简单的解决方案。但它确实需要先将您的字符串转换为数值并除以 100。不要进行笨拙的字符串操作,而是使用适当的工具 NumberFormatter

标签: swift string decimal comma


【解决方案1】:

您可以尝试先将价格转换为整数,然后除以 100 - 这样您就有了小数/浮点值。然后使用NSNumberFormatter转回字符串

更新

let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
formatter.minimumIntegerDigits = 1
// formatter.decimalSeparator = "." <- optional step

let double1 = Double(0.5)
let double2 = Double(100.00)
let double3 = Double(50.00555)

print(formatter.string(for: double1))
print(formatter.string(for: double2))
print(formatter.string(for: double3))

// prints
Optional("0.50")
Optional("100.00")
Optional("50.01")

【讨论】:

    【解决方案2】:

    要将其转换为您想要的格式,您需要将数字字符串转换为浮点数,然后除以 100,然后再次返回一个字符串。

    以下是我根据您的想法改编的扩展。

    var numberString = "20"
    
    extension String {
        var decimalString: String? {
            guard let float = Float(self) else { return nil }
            let fraction = float / 100
    
            return String(format: "%.2f", fraction)
        }
    }
    
    // You could unwrap the option either this way...
    if let decimalString = numberString.decimalString {
        print(decimalString)
    }
    
    // or this way...
    print(numberString.decimalString ?? "Invalid value")
    

    【讨论】:

      【解决方案3】:

      您必须使用 NumberFormatter 并将您的值除以 100

      这里是一个简单的 String 扩展,如果字符串不能转换为 Double 它将返回字符串值:

      extension String {
      var convertToPrice: String? {
          guard let value = Double(self) else { return self }
          let divided = value / 100
          let currencyFormatter = NumberFormatter()
          currencyFormatter.numberStyle = .currency
          currencyFormatter.currencySymbol = ""
          currencyFormatter.decimalSeparator = "."
          if let priceString = currencyFormatter.string(for: divided) {
              return priceString
          }
          return self
      }
      }
      

      用法:

      "50".convertToPrice // "0.50"
      

      【讨论】:

      • 您对 NSNumber 的看法是对的,我会更新我的答案,谢谢。我硬编码了小数点分隔符,因为在示例中没有货币符号,所以我认为格式总是像“0.50”,如果语言环境设置为他们使用逗号的国家,它会改变所以我对其进行硬编码以适合示例值
      • 我认为假设 OP 想要将分隔符硬编码为 . 是一个真正的跳跃,即使这可能会让不同地区的用户感到困惑。这个问题的性质让我认为 OP 甚至没有考虑过语言环境……
      • 如果您将货币符号重置为空字符串,那么将数字格式化程序设置为货币有什么意义?为什么要硬编码小数分隔符?
      • @rmaddy - FWIW,有一些语言的.decimal 格式与.currency 格式不同。例如。 ml_IN(马拉雅拉姆语)或en_FI(英语-芬兰)。此外,如果您想这样做,使用.currency 将按照习惯设置该区域的主要货币的小数位(在日元中,您通常没有任何小数位)。
      【解决方案4】:

      发现这更容易:

      func formatPrice(price: String) -> String{
          let pr = Double(price)!/100
          return String(format: "%.2f",pr)
      }
      
      usage: formatPrice("1000") //returning 10.00
      

      【讨论】:

      • 感谢 Andrey Gershengoren 的澄清帮助我编写了这个函数
      • 这也是一个解决方案,但无论如何都应该避免Double(price)!
      • 是的,Joakim,但我返回的 String() 仍然是字符串
      • 为什么要避免安德烈?
      • @SalihanPamuk 如果你曾经在一个不会转换为双精度的字符串上运行 formatPrice(price:),它会抛出一个异常并且你的应用程序会崩溃。此外,如果您只需要 2 位小数,则不需要 Double。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2022-08-11
      • 1970-01-01
      相关资源
      最近更新 更多