我需要将0、1或2个0
附加到字符串中,具体取决于其十进制分隔符,因此
我可以找到小数点分隔符并检查其与字符串结尾endIndex
的距离,但是有没有更简单的方法呢?
NumberFormatter
可以做到这一点,但是我拥有的实际字符串不是可以通过格式化程序使用的纯数字。
例如:
let amount = "123,456,789"
则格式化后的金额应为“ 123,456,789.00”
假设:
给定的字符串最多具有一个小数点分隔符,最多具有两个小数点位
因此不能有类似“ 123.4.4.5”的字符串
我也想使用NumberFormatter().decimalSeparator
答案 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"
(在使用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
或将其定义为 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