Swift String:在小数点分隔符后附加0s

时间:2018-09-10 06:55:08

标签: swift string

我需要将0、1或2个0附加到字符串中,具体取决于其十进制分隔符,因此

  • “ 100”,“ 100”。而“ 100.0”变为“ 100.00”
  • “ 100.8”变为“ 100.80”
  • “ 100.85”保持不变

我可以找到小数点分隔符并检查其与字符串结尾endIndex的距离,但是有没有更简单的方法呢?

NumberFormatter可以做到这一点,但是我拥有的实际字符串不是可以通过格式化程序使用的纯数字。

例如:

let amount = "123,456,789"

则格式化后的金额应为“ 123,456,789.00”

假设:

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

因此不能有类似“ 123.4.4.5”的字符串

我也想使用NumberFormatter().decimalSeparator

中的小数点分隔符

2 个答案:

答案 0 :(得分:1)

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

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"

(在使用nilif 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

或将其定义为 String 上的扩展名:

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"

答案 1 :(得分:0)

这是我在Playground上测试过的以下代码段,可以更聪明地实现,但目前可以正常使用。

#[1] 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25