使用 Swift 如何将字符串转换为数字
Posted
技术标签:
【中文标题】使用 Swift 如何将字符串转换为数字【英文标题】:Using Swift how to convert a string to a number 【发布时间】:2015-01-16 19:43:37 【问题描述】:我从 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)")
这在调试中打印出“数字是可选的(1.5)”而不是 1.50!
我已将 NSNumberFormatterStyle.DecimalStyle 更改为 NSNumberFormatterStyle.CurrencyStyle,因为我认为这可能对我有用,因为返回的数字无论如何都是一种货币,但这让我回到调试“返回的数字为零” - 这更令人困惑给我!
我尝试使用 maximumIntegerDigits 和 minimumIntegerDigits,使用 n.locale = NSLocale.currentLocale() 设置语言环境,设置 formatWidth,设置 paddingPosition 和 paddingCharacter 但没有任何帮助,我要么将 nil 恢复到 1.5。
我最终需要做的就是将字符串转换为浮点数或货币值,并确保有 2 位小数,我不敢相信这很难做到!
我们将不胜感激。
【问题讨论】:
let returnNumber = n.numberFromString(testnumber)?.floatValue()
呢?
不,仍然返回 1.5
***.com/questions/27931702/…
【参考方案1】:
您打印的是数字而不是字符串
Xcode 11.4 • Swift 5.2 或更高版本
extension Formatter
static let usCurrency: NumberFormatter =
let formatter = NumberFormatter()
formatter.locale = .init(identifier: "en_US")
formatter.numberStyle = .currency
return formatter
()
extension String
var double: Double? Double(self)
var usCurrencyFormatted: String
Formatter.usCurrency.string(for: double) ?? Formatter.usCurrency.string(for: 0) ?? ""
"1.1222".usCurrencyFormatted // "$1.12"
"2".usCurrencyFormatted // "$2.00"
【讨论】:
【参考方案2】:问题是关于 numberFromString
返回一个可选的 - 所以你必须在打印之前打开包装。为了安全起见,您可以使用可选绑定:
if let returnNumber = n.numberFromString(testnumber)
println("Returned number is \(returnNumber)")
否则,如果可选项为 nil(在某些情况下,如果希望可选项始终包含非 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 作为参考。
【讨论】:
@Dave:1.5 和 1.50 是完全相同的数字。 我知道 1.5 和 1.50 是同一个数字,但需要对用户正确格式化。谁见过给用户的价格是 1.5 美元而不是 1.50 美元。这就是我想要做的。 @Dave:嗯,在你的问题中,你说你想 "... 将字符串转换为浮点数" 而 1.5 是浮点数。如果您想将其显示为“$1.50”,则必须将浮点数转换回具有合适数字格式化程序的字符串。【参考方案3】:您可能只使用您刚刚创建的NSNumberFormatter
。
let returnNumber = n.stringFromNumber(n.numberFromString(testnumber))
returnNumber
现在将是 String
类型。
【讨论】:
【参考方案4】:以下内容在操场上为我返回到小数点后 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))
【讨论】:
以上是关于使用 Swift 如何将字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章
在Swift或Objective-C中将大型混合数字和文本数字转换为数字
Swift:如何将带有 Alamofilre 或 SwiftyJSON 的 JSON 字符串转换为 ObjectMapper?