2016-03-04 30 views
0

這似乎是一個超級基本問題,但我似乎無法在別處找到了答案:-(我能做到這一點在Objective C,但我被陷在斯威夫特。在Swift中,如何將格式化的Int值插入到String中?

我需要什麼要做到:

  1. 的一個整數值
  2. 格式它變成一個本地化字符串
  3. 注入的值成使用stringWithFormat等效方法(因爲該另一個串被局部化,以及,未示出另一串在下面的簡化例子中)

它是如何在目標C容易做到 - 這工作:

// points is of type NSNumber * 

    NSNumberFormatter *formatter = [NSNumberFormatter new]; 
    formatter.locale    = [NSLocale currentLocale]; 
    formatter.numberStyle  = NSNumberFormatterDecimalStyle; 

    NSString *ptsString = [formatter stringFromNumber:points]; 
    NSString *message = [NSString stringWithFormat:@"You've earned %@ points", ptsString]; 

斯威夫特這樣做我的最好的嘗試 - 在最後一行編譯器錯誤:

// points is of type Int 

    let formatter   = NSNumberFormatter() 
    formatter.locale  = NSLocale.currentLocale() 
    formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle 

    let ptsString = formatter.stringFromNumber(points)! 
    let message = String(format: "You've earned %@ points", arguments: ptsString) 

我在最後一行的Xcode中收到以下錯誤:

"Cannot convert value of type 'String' to expected argument type '[CVarArgType]'" 

(在我的實際代碼,到了我想插入點值的該消息本身定位爲好,但我已經簡化這個例子中,我得到確切同樣的錯誤在這兩種情況下。)

我在這裏想念什麼..?

感謝這麼多的幫助,

埃裏克

+0

這的確是非常基本的。請閱讀Swift語言指南中的[字符串和字符](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html)章節字符串插值 – vadian

+0

謝謝。現在正在讀... –

+0

啊,是的,我知道這件事。我應該在我的問題中澄清,我不能使用字符串插值,因爲其中含有%@的消息實際上是本地化的,並以8種不同的語言翻譯。 –

回答

6

你需要用的參數的收藏。就像這樣:

let message = String(format: "You've earned %@ points", arguments: [ptsString]) 

您也可以使用這個方法:

let message = "You've earned \(ptsString) points" 

此外,您可以創建一個擴展方法來做到這一點:

extension String { 
    func format(parameters: CVarArgType...) -> String { 
     return String(format: self, arguments: parameters) 
    } 
} 

現在你可以這樣做:

let message = "You've earned %@ points".format("test") 
let message2params = "You've earned %@ points %@".format("test1", "test2") 
+0

啊,謝謝!事實上,將它包裝在一個集合中可以解決這個問題:'String(format:「你已經獲得了%@ points」,參數:[ptsString])''。在這種情況下,這是多麼必要?從我在網上看到的其他例子,我沒有看到參數變量周圍的'['和']'括號... –

+1

您不需要將參數包裝到數組中,請參閱Anton對該問題的評論。 –

+0

太棒了!感謝大家的超快速響應。哇...非常感謝! –

2

有時,你需要更多的控制 - 所以如果你需要有前導零,你可以使用'stringWithFormat'就像在目標中一樣C

let ptsString = String(format: "%02d", points) 
相關問題