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

3

我有一个添加千位分隔符的问题。
我有三种类型的数字字符串。
我在 stack 的这里找到了答案
但是我尝试使用它,未能添加千位分隔符。
你有任何建议吗?谢谢。

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) ?? ""
    }
}

为什么要减去我的问题? - JimmyLee
如果这个答案解决了问题,您是否愿意接受它?这将有助于其他人快速找到答案。 - Kamran
2个回答

7
数字格式化程序不以“数字字符串”开头;它们以一个数字开头。因此,例如,使用您已经拥有的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"; 我们开始的字符串的原始外观完全不重要。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接