2017-10-16 219 views
0

问题是我的API响应返回订单[indexPath.row] .price作为String。该字符串实际上是双倍值,如3.55973455234。我需要将此值转换为3.56之类的内容并显示在UI标签中。自从早上起,我一直在拉我的头发来达到这个目的。为什么Swift在转换时如此可怕?将字符串转换为Double然后返回字符串

 cell.lblPayValue.text = orders[indexPath.row].price 
+0

[检查此答案](https://stackoverflow.com/q/41558832/335858),它可能有一个很好的解释给你。 – dasblinkenlight

回答

1

你也可以使用的NumberFormatter但你需要将其转换回的NSNumber ...

let formatter = NumberFormatter() 
formatter.numberStyle = .decimal 
formatter.maximumFractionDigits = 2 
formatter.locale = Locale(identifier: "en_US") 

if let number = formatter.number(from: orders[indexPath.row].price) { 
    cell.lblPayValue.text = formatter.string(from: number) 
} 

但请不要创建n个的NumberFormatter。创建一个并将其存储在某个地方。

+0

嘿它似乎没有击中if语句我们可以做些什么,以便它总是在if区块内? – Ackman

+0

可能是小数点分隔符的问题。解析时,区域设置应始终设置正确。 – Sulthan

+0

也许您的号码采用与区域设置不同的方式进行格式化(因为NumberFormatter是区域设置特定的)。尝试使用更新的代码。无论如何,尽量不要使用这个解决方案,因为你会创建*也许*不必要的资源。但NumberFormatter仍然提供一些优势。 – McNight

1

只要做到这一点是这样的:

let formatter = NumberFormatter() 
formatter.numberStyle = .currency 

if let price = Double(orders[indexPath.row].price), let formattedPrice = formatter.string(for: price) { 
    cell.lblPayValue.text = formattedPrice 
} 
  1. 所以你第一次得到双重价值与IF-让
  2. 然后你使用它来设置你的cell.lblPayValue.text
  3. 您使用格式化程序获取您的货币格式Double
+0

没有。不设置任何值。 – Ackman

+0

你确定'orders [indexPath.row] .price'有一个有效的double吗?用'NumberFormatter –

+0

检查更新的答案btw不需要再投射到'NSNumber'。该业务指出,“价格”是一个字符串。 – Sulthan

1

转换是非常简单的恕我直言。您可以通过使用带字符串的初始化工具创建一个新的Double。然后你有一个可选的双。然后可以将其转换为格式化的字符串。所以...

let price: String = "3.55973455234" // your price 
    let text = String(format: "%.2f", Double(price)!) 
    print(text) // prints 3.56 
相关问题