代码之家  ›  专栏  ›  技术社区  ›  Heuristic

Swift字符串:在小数点分隔符后追加0s

  •  -1
  • Heuristic  · 技术社区  · 6 年前

    0 s到一个字符串,取决于它的十进制分隔符,所以

    • “100”、“100.”和“100.0”变为“100.00”
    • “100.8”变为“100.80”
    • “100.85”不变

    我可以找到小数点分隔符并检查它到终点的距离 endIndex 但是有没有更简单的方法呢?

    NumberFormatter 但实际的字符串不是一个可以通过格式化程序处理的普通数字。

    例如:

    let amount = "123,456,789"

    假设:

    给定的字符串最多有一个小数点分隔符,最多有两个小数位

    所以不能有这样的字符串:“123.4.4.5”

    我还想使用十进制分隔符从 NumberFormatter().decimalSeparator

    2 回复  |  直到 6 年前
        1
  •  1
  •   ielyamani    6 年前

    您可以通过十进制格式化程序传递字符串以获取基础数字,然后再次通过格式化程序返回以获取格式化字符串:

    let amount = "123,456,789"
    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    formatter.maximumFractionDigits = 2
    formatter.minimumFractionDigits = 2
    let number = formatter.number(from: amount)
    let newAmountString = formatter.string(from: number!)  //"123,456,789.00"
    

    (您应该检查号码是否正确 nil if let guard )

    您可以将其包装到函数中:

    func zeroPadding(toString: String) -> String? {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.maximumFractionDigits = 2
        formatter.minimumFractionDigits = 2
        guard let number = formatter.number(from: toString) else {
            return nil
        }
        return formatter.string(from: number)
    }
    

    以下是一些测试案例:

    zeroPadding(toString: "123,456,789")         //"123,456,789.00"
    zeroPadding(toString: "123,456,789.0")       //"123,456,789.00"
    zeroPadding(toString: "123,456,789.10")      //"123,456,789.10"
    zeroPadding(toString: "123,456,789.123")     //"123,456,789.12"
    zeroPadding(toString: "123.4567")            //"123.46"
    zeroPadding(toString: "Price: 1€ for a 💩")  //nil
    

    或者将其定义为 字符串

    extension String {
        func withZeroPadding() -> String? {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.maximumFractionDigits = 2
            formatter.minimumFractionDigits = 2
            guard let number = formatter.number(from: self) else {
                return nil
            }
            return formatter.string(from: number)
        }
    }
    

    像这样使用:

    "123.4.4.5".withZeroPadding()    //nil 
    "12.".withZeroPadding()          //"12.00"
    "123,456,789".withZeroPadding()  //"123,456,789.00"
    
        2
  •  0
  •   Manish Pathak    6 年前

    这是我在操场上测试的下面的代码片段,它可以更巧妙地实现,但现在它正在工作。

    //let amount = "123,456,789.545222323"
    //let amount = "123,456,789."
    let amount = "123,456,789"
    let removeSpaces = amount.replacingOccurrences(of: " ", with: "")
    
    
    if removeSpaces.count > 0
    {
    let arrSTR = removeSpaces.components(separatedBy: ".")
    if  arrSTR.count > 1
    {
        var strAfterDecimal = arrSTR[1]
        if strAfterDecimal.count >= 2
        {
            strAfterDecimal = strAfterDecimal[0..<2]
        }else if strAfterDecimal.count != 0
        {
            strAfterDecimal = "\(strAfterDecimal)0"
        }else
        {
            strAfterDecimal = "00"
        }
        let finalSTR = String("\(arrSTR[0]).\(strAfterDecimal)")
        print("Final with Decimal - \(finalSTR)")
    }else
    {
        let finalSTR = String(arrSTR[0] + ".00")
        print("Final without Decimal - \(finalSTR)")
    }
    }
    
    extension String {
    subscript(_ range: CountableRange<Int>) -> String {
        let idx1 = index(startIndex, offsetBy: max(0, range.lowerBound))
        let idx2 = index(startIndex, offsetBy: min(self.count, range.upperBound))
        return String(self[idx1..<idx2])
    }
    }