使用分隔符转换数字甲酸



如何用

分开转换数字构造

示例结果字符串

 "38963.26" value into "38,863.26"
  "1013321.22" Value into "10,13,321.22"
//MARK:- Seperator number formate 1000 - 1,000
extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = ","
        formatter.numberStyle = .decimal
        return formatter
    }()
}
extension BinaryFloatingPoint {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}

let resultValue = StringValue.CGFloatValue()?.formattedWithSeparator
print("Resultant", resultValue!)

cgfloatvaule默认方法,用于将字符串转换为floatValue。像string.floatvalue一样。

对于价值" 38963.26" 给出了结果值" 38,963.262" 我想知道为什么它像十进制中的额外2一样。

print("38963.26".CGFloatValue()!.formattedWithSeparator)
Output "38,863.262"

在您的格式化一个实例上设置适当的(使用此样式用于格式化的语言环境(,或者在格式化的实例上设置小数和分组分隔符,因为并非所有语言环境都可能使用相同的分离器。

然后,如果您使用的是float(由于某种原因,Double不需要(

,您还需要设置最大分数数字
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "en_US")
formatter.maximumFractionDigits = 2
if let str = formatter.string(for: Float(numberString)) {
    print(str)
}

let formatter = NumberFormatter()
formatter.groupingSeparator = ","
formatter.decimalSeparator = "."
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
if let str = formatter.string(for: Float(numberString)) {
    print(str)
}

两者都产生

38,963.26

请参考以下内容: - 如何将逗号添加到Swift中的一个数字?在此处输入链接描述

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let numberString = "38963.26"
if let number = Double(numberString),
    let formattedNumber = numberFormatter.string(from: NSNumber(value: number)) {
        let formattedString = "(formattedNumber)"
        print(formattedString)
    }

有三个问题:

  1. 使用显式分组分离器。

    强迫成千上万的分离器"是适得其反的。如果该设备位于已经默认的语言环境中,则无需指定它。而且,如果该设备位于不默认的语言环境中,那么对于不习惯看到"千分之一分隔符的用户而言,它将极大地混淆。更糟糕的是,如果您要覆盖分组分离器,也应该覆盖小数分离器。如果这是在用户界面中显示的字符串,我建议不要触摸分组分隔符(或任何这些属性(:

    static let decimal: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter
    }()
    

    如果您真的想强制使用,进行分组分组,而.进行十进制分离器(即使用户可能位于一个区域中,如果您在用户界面中表现出可能会令人困惑的地方(,您也应该继续并将其更改为您想要的任何东西,例如

    static let decimal: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.locale = Locale(identifier: "en_US") // or "en_IN" or whatever
        return formatter
    }()
    
  2. 小数点。

    如果您总是想要两个小数点的位置,则:

    static let decimal: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.minimumFractionDigits = 2
        formatter.maximumFractionDigits = 2
        return formatter
    }()
    

    通过设置最小分数,您确保42.1将显示为" 42.10"。通过设置最大分数数字,您确保42.33333将显示为" 42.33"。

  3. 从字符串转换为二进制浮点和返回字符串的问题。

    小数点位置的基本问题是,您将字符串转换为二进制浮点数。如果使用Double,则比Float/CGFloat捕获更多的数字,但是当您将字符串转换为二进制浮点代表时,您仍在引入四舍五入错误。Float开始在第七大十进制数字上引入转换错误。Double将转换误差定为第15个有效的十进制数字。

    您可以考虑使用数字格式,该格式将捕获多达38位数字而无需四舍五入问题,即Decimal。因此:

    extension NumberFormatter {
        static let decimal: NumberFormatter = {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            // specify locale and/or fraction digits as needed
            return formatter
        }()
    }
    extension String {
        func decimalFormatted() -> String? {
            return Decimal(string: self).flatMap { NumberFormatter.decimal.string(for: $0) }
        }
    }
    

    ,然后

    let string = "38963.26"
    let foo = string.decimalFormatted() ?? ""
    

最新更新