JSON'dan hızlı bir şekilde aldığım bir sayıya nasıl virgül eklerim?
Example
31908551587 to
31,908,551,587
Kafam çok karıştı ve ne yapacağım konusunda hiçbir fikrim yok.
JSON'dan hızlı bir şekilde aldığım bir sayıya nasıl virgül eklerim?
Example
31908551587 to
31,908,551,587
Kafam çok karıştı ve ne yapacağım konusunda hiçbir fikrim yok.
Yanıtlar:
İle yapabilirsin NSNumberFormatter
Swift 4
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Hızlı 3
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Swift 2
let largeNumber = 31908551587
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let formattedNumber = numberFormatter.stringFromNumber(largeNumber)
Özgür Ersil'in cevabını genişleterek, işlevselliği Int'e bir genişletme ile izole edebilirsiniz:
extension Int {
func withCommas() -> String {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
return numberFormatter.string(from: NSNumber(value:self))!
}
}
Daha sonra kodunuzda şu şekilde kullanmak için:
largeNumber.withCommas()
Ayrıca Juan Fran Jimenez'in cevabını genişleterek, bir formatlayıcıyı örneklemek genellikle nispeten pahalı bir işlem olduğundan, formatlayıcıyı bir tekil haline getirmenizi tavsiye ederim. (Kullanıcı yazarken hareket halindeyken biçimlendirme yapıyorsanız performansı etkileyebilir.)
extension Int {
private static var commaFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter
}()
internal var commaRepresentation: String {
return Int.commaFormatter.string(from: NSNumber(value: self)) ?? ""
}
}
Uzantısı aracılığıyla bir değişken sağlayacak uzantıda basit bir düşüş Int
.
Julien'in cevabında belirtildiği gibi, bu, performans nedenleriyle statik bir biçimlendiriciden yararlanır.
extension Int {
private static var numberFormatter: NumberFormatter = {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
return numberFormatter
}()
var delimiter: String {
return Int.numberFormatter.string(from: NSNumber(value: self)) ?? ""
}
}
Kullanmak için:
let number = 31908551587
print(number.delimiter) // 31,908,551,587
internal var
ve sadece var var
. Cevabınız sohbete ne katıyor? Ayrıca değişkeninizin delimiter
yanıltıcı olduğunu söyleyebilirim . Julien'inki commaRepresentation
çok daha kullanışlı.
Bu, virgül konumunu ayarlamanın ek bir yoludur. Diyelim ki 10000000 sayısının "1,00,00,000" olarak yazdırılmasını istiyorum
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.groupingSize = 3
numberFormatter.secondaryGroupingSize = 2
numberFormatter.string(from: 10000000)
Miktar metin alanı için bir sınıf oluşturdum. Bunu metin alanı sınıfınıza ayarlamanız yeterlidir. Ör- 1234567 girin. Bunu 1.234.567'ye dönüştürecek Ayrıca ondalık giriş için çalışacak, ondalıktan sonra iki hane alacaktır.
class AmountField: UITextField {
private var isFirstDecimal : Bool = true
override func willMove(toSuperview newSuperview: UIView?) {
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
keyboardType = .decimalPad
textAlignment = .left
placeholder = "0.0"
editingChanged()
}
override func deleteBackward() {
var currentText = self.text ?? ""
currentText = String(currentText.dropLast())
self.text = currentText
editingChanged(self)
}
@objc func editingChanged(_ textField: UITextField? = nil) {
var doubleStr = textField?.text ?? "00"
let decimalCount = doubleStr.components(separatedBy: ".")
if decimalCount.count > 2 {
var currentText = self.text ?? ""
currentText = String(currentText.dropLast())
self.text = currentText
return
}
if doubleStr.contains(".") && isFirstDecimal == true {
self.text = doubleStr
isFirstDecimal = false
return
}
else if !(doubleStr.contains(".")) {
isFirstDecimal = true
}
let doubleStrTemp = doubleStr.replacingOccurrences(of: ",", with: "")
if doubleStrTemp != "" {
if let n = Decimal(string: doubleStrTemp )?.significantFractionalDecimalDigits {
if n > 2 {
var currentText = self.text ?? ""
currentText = String(currentText.dropLast())
self.text = currentText
return
}
}
}
doubleStr = doubleStr.replacingOccurrences(of: ",", with: "")
let doube = Double(doubleStr)
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
if doube != nil {
let formattedNumber = numberFormatter.string(from: NSNumber(value:doube!))
self.text = formattedNumber
}
}}
extension Decimal {
var significantFractionalDecimalDigits: Int {
return max(-exponent, 0)
}}