如何在Int和Float类型中添加千位分隔符?

时间:2018-11-26 05:56:27

标签: ios swift

我有一个关于添加千位分隔符的问题。
我有三种类型的数字字符串。
我在堆栈here.中找到了答案
但我尝试使用它,但未能添加千位分隔符。
对我有什么想法吗?谢谢。

let str = "1000"
let string1 = "5000.000"
let string2 = "2000.0"

let convertStr = str.formattedWithSeparator //in playground, get error 「Value of type 'String' has no member 'formattedWithSeparator'」.
let convertStr1 = Float(string1)!.formattedWithSeparator //get error too.
let convertStr2 = Float(string2)!.formattedWithSeparator //get error too.


extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = ","
        formatter.numberStyle = .decimal
        return formatter
    }()
}

extension BinaryInteger {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}

2 个答案:

答案 0 :(得分:7)

数字格式化程序不能以“数字字符串”开头;它们以 number 开头。因此,例如,使用Formatter扩展代码,您已经拥有:

let n = 5000
let s = Formatter.withSeparator.string(for: n)
// s is now "5,000"

但是,假设您开始时实际上是一个字符串。然后您可以说,例如:

let str = "5000"
let s = Formatter.withSeparator.string(for: Float(str)!)
// s is now "5,000"

观察到此过程中会丢失小数信息。如果这对您很重要,则需要将该要求添加到格式化程序本身。您正在制作一个字符串,并且必须提供有关该字符串外观的所有信息。例如:

let str = "5000.00"
let f = Formatter.withSeparator
f.minimumFractionDigits = 2
let s = f.string(for: Float(str)!)
// s is now "5,000.00"

如果省略mimimumFractionDigits信息,您将再次获得"5,000";我们开始使用的字符串的原始外观完全不重要。

答案 1 :(得分:0)

您可以使用此方法

func currencyMaker(price: NSNumber) -> String {

   let numberFormatter = NumberFormatter()
   numberFormatter.numberStyle = NumberFormatter.Style.decimal
   numberFormatter.groupingSeparator = ","
   let formattedNumber = numberFormatter.string(from: price)

   return formattedNumber!
}

像这样:

let myNumber1 = currencyMaker(price: 2000)
let myNumber2 = currencyMaker(price: 5983223)

打印为:

print(myNumber1) // 2,000
print(myNumber2) // 5,983,223