Zanim zaktualizowałem xCode 6, nie miałem problemów z rzutowaniem double na ciąg, ale teraz wyświetla mi się błąd
var a: Double = 1.5
var b: String = String(a)
Daje mi komunikat o błędzie „double nie da się zamienić na łańcuch”. Czy jest na to inny sposób?
var b = "\(a)"
Odpowiedzi:
Nie jest rzutowaniem, ale tworzeniem łańcucha z wartości o określonym formacie.
W innym formacie:
Możesz również pominąć tę
format
właściwość, jeśli formatowanie nie jest potrzebne.źródło
format:"%.1f" = 1 digit // 1.5
;format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
.zaktualizuj Xcode 7.1 • Swift 2.1:
Teraz Double można również zamienić na String, więc możesz go po prostu używać, jak chcesz:
Swift 3 lub nowszy możemy rozszerzyć
LosslessStringConvertible
i uczynić go ogólnymXcode 11.3 • Swift 5.1 lub nowszy
Dla ustalonej liczby cyfr ułamkowych możemy rozszerzyć
FloatingPoint
protokół:Jeśli potrzebujesz większej kontroli nad formatem liczb (minimalne i maksymalne cyfry ułamkowe oraz tryb zaokrąglania), możesz użyć NumberFormatter:
źródło
String(format: "%.\(digits)f", self as! CVarArg)
zString(format: "%.*f", digits, self as! CVarArg)
Oprócz odpowiedzi @Zaph możesz tworzyć
extension:
Stosowanie:
źródło
a.toString()
zobaczy inny programista, na pewno będzie moment WTF.myToString()
aby mieć pewność, że jest to niestandardowa definicja. Ale podobnie jak w innych językach, prototypowanie prowadzi do uniknięcia powielania kodu i dobrej konserwacji.println("output: \(a.toString())")
iprintln("output: \(a)")
. Druga opcja nie powoduje błędów kompilacji. Czy ta opcja jest złą praktyką?yourDouble?.toString() ?? ""
Swift 3+: wypróbuj ten wiersz kodu
źródło
aby coś stało się ciągiem w swift, z wyjątkiem być może wartości wyliczeniowych, po prostu zrób to, co robisz w metodzie println ()
na przykład:
źródło
Swift 4 : Użyj następującego kodu
źródło
Ta funkcja umożliwia określenie liczby miejsc dziesiętnych do wyświetlenia:
Stosowanie:
źródło
String(format:"%."+numberOfDecimalPlaces.description+"f", number)
zString(format:"%.*f", numberOfDecimalPlaces, number)
Istnieje wiele odpowiedzi, które sugerują różne techniki. Ale podczas prezentowania liczb w interfejsie użytkownika zawsze chcesz użyć znaku a,
NumberFormatter
aby wyniki były odpowiednio sformatowane, zaokrąglone i zlokalizowane:Jeśli chcesz mieć stałą liczbę miejsc dziesiętnych, np. Dla wartości walut
Ale piękno tego podejścia polega na tym, że będzie ono odpowiednio zlokalizowane, co spowoduje, że w
10,000.50
USA, ale10.000,50
w Niemczech. Różne lokalizacje mają różne preferowane formaty liczb i powinniśmy pozwolić naNumberFormatter
użycie formatu preferowanego przez użytkownika końcowego podczas prezentowania wartości liczbowych w interfejsie użytkownika.Nie trzeba dodawać, że chociaż
NumberFormatter
jest niezbędny podczas przygotowywania reprezentacji ciągów w interfejsie użytkownika, nie powinien być używany w przypadku zapisywania wartości liczbowych jako ciągów do trwałego przechowywania, interfejsu z usługami sieciowymi itp.źródło
W Swift 3:
źródło
W Swift 3 jest to proste, jak podano poniżej
źródło
"Optional(6.1696108999999995)"
Dla mnie.To działa dla mnie. Możesz spróbować
źródło
W Swift 4, jeśli chcesz modyfikować i używać Double w interfejsie użytkownika jako textLabel „String”, możesz dodać to na końcu swojego pliku:
}
I użyj tego w ten sposób, jeśli chcesz mieć to na etykiecie tekstowej:
Lub wydrukuj jako Int:
źródło
Wolałbym podejście NSNumber i NumberFormatter (w razie potrzeby), a także możesz użyć rozszerzenia, aby uniknąć wzdęcia kodu
Możesz również potrzebować odwrotnego podejścia
źródło
LossLessStringConvertible
protokołem zamiast rozszerzania Doubleextension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : Użyj następującego kodu
źródło
String(format: "%.\(points)f", self)
zString(format: "%.*f", points, self)