我从一个Web服务中获取值,这个值以字符串格式返回价格,这被放入一个字典中,所以我将价格恢复为“1.5000”,例如货币明显为1.50。然而,对于我的生活,我无法在Swift中工作以正确格式化。在大多数其他语言中,您可以在几秒钟内完成此操作,因此我对这么简单的事情感到有点沮丧。
这是我的测试代码:
var testnumber = "1.5000"
let n = NSNumberFormatter()
n.numberStyle = NSNumberFormatterStyle.DecimalStyle
n.maximumFractionDigits = 2
n.minimumFractionDigits = 2
let returnNumber = n.numberFromString(testnumber)
println("Returned number is \(returnNumber)")
这打印出调试“number is Optional(1.5)”而不是1.50!
我已经将NSNumberFormatterStyle.DecimalStyle更改为NSNumberFormatterStyle.CurrencyStyle,因为我认为这可以为我做,因为返回的数字无论如何都是货币,但这让我回到调试“返回的数字是零” - 这更令人困惑对我来说!
我尝试过使用maximumIntegerDigits和minimumIntegerDigits,使用n.locale = NSLocale.currentLocale()设置区域设置,设置formatWidth,设置paddingPosition和paddingCharacter但没有任何帮助,我要么返回1.5。
我最终需要做的就是将字符串转换为浮点数或货币值,并确保有2个小数位,我不敢相信这很难实现!
非常感谢任何帮助。
答案 0 :(得分:7)
您正在打印的数字不是字符串
Xcode 9•Swift 4
extension String {
var twoFractionDigits: String {
let styler = NumberFormatter()
styler.minimumFractionDigits = 2
styler.maximumFractionDigits = 2
styler.numberStyle = .currency
let converter = NumberFormatter()
converter.decimalSeparator = "."
if let result = converter.number(from: self) {
return styler.string(for: result) ?? ""
}
return ""
}
}
"1.1222".twoFractionDigits // "$1.12"
"2".twoFractionDigits // "$2.00"
答案 1 :(得分:1)
问题是关于numberFromString
返回一个可选项 - 所以你必须在打印之前解包。为了安全起见,您可以使用可选绑定:
if let returnNumber = n.numberFromString(testnumber) {
println("Returned number is \(returnNumber)")
}
否则如果应用程序崩溃,如果可选项为nil(在某些情况下,如果期望可选项始终包含非零值,则这是一个想要的行为),只需使用强制解包:
let returnNumber = n.numberFromString(testnumber)!
println("Returned number is \(returnNumber)")
修复了不需要的"Optional(xx)"
文字。至于格式化浮点数/双数,可能有几种方法 - 我将使用的是类似c的字符串格式,可通过NSString
获得:
let formattedNumber = NSString(format: "%.2f", returnNumber)
println("Returned number is \(formattedNumber)")
如果您想了解有关格式说明符的更多信息,请使用String Format Specifiers作为参考。
答案 2 :(得分:0)
您可以使用刚创建的NSNumberFormatter
。
let returnNumber = n.stringFromNumber(n.numberFromString(testnumber))
returnNumber
现在属于String
类型。
答案 3 :(得分:0)
以下为我在游乐场返回2位小数。对你有所帮助。使用NSNumberFormatter,然后解包可选的
let testnumber: String = "1.50000"
let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString(testnumber)
if let final = number?.floatValue {
println("Returned number is " + String(format: "%.2f", final))
}