Poniżej znajduje się sposób, w jaki wcześniej obciąłem liczbę zmiennoprzecinkową do dwóch miejsc po przecinku
NSLog(@" %.02f %.02f %.02f", r, g, b);
Sprawdziłem dokumenty i eBook, ale nie byłem w stanie tego rozgryźć. Dzięki!
Moje najlepsze jak dotąd rozwiązanie, wynikające z odpowiedzi Davida :
import Foundation
extension Int {
func format(f: String) -> String {
return String(format: "%\(f)d", self)
}
}
extension Double {
func format(f: String) -> String {
return String(format: "%\(f)f", self)
}
}
let someInt = 4, someIntFormat = "03"
println("The integer number \(someInt) formatted with \"\(someIntFormat)\" looks like \(someInt.format(someIntFormat))")
// The integer number 4 formatted with "03" looks like 004
let someDouble = 3.14159265359, someDoubleFormat = ".3"
println("The floating point number \(someDouble) formatted with \"\(someDoubleFormat)\" looks like \(someDouble.format(someDoubleFormat))")
// The floating point number 3.14159265359 formatted with ".3" looks like 3.142
Myślę, że jest to najbardziej szybkie rozwiązanie, wiążące operacje formatowania bezpośrednio z typem danych. Możliwe, że gdzieś jest wbudowana biblioteka operacji formatowania, a może wkrótce zostanie wydana. Pamiętaj, że język jest wciąż w fazie beta.
prosty sposób to:
źródło
println(String(format: "a float number: %.5f", 1.0321))
printf
bez konieczności pisania osobnych rozszerzeń.import Foundation
Stwierdziłem,
String.localizedStringWithFormat
że działa całkiem dobrze:Przykład:
źródło
Jest to bardzo szybki i prosty sposób, który nie wymaga złożonego rozwiązania.
źródło
Col 16: 'init' has been renamed to 'init(describing:)'
Większość odpowiedzi tutaj jest poprawnych. Jednak w przypadku częstego formatowania liczby należy rozważyć rozszerzenie klasy Float w celu dodania metody zwracającej sformatowany ciąg. Zobacz przykładowy kod poniżej. Ten osiąga ten sam cel, używając formatera liczb i rozszerzenia.
Konsola pokazuje:
Aktualizacja SWIFT 3.1
źródło
NSNumberFormatter
takiej odpowiedzi. Inne wysoko głosowane odpowiedzi po prostu nie odzwierciedlają ustawień regionalnych urządzenia (np. W niektórych lokalizacjach używają przecinka do miejsca po przecinku; to odzwierciedla; inne odpowiedzi tego nie robią).NSNumberFormatter
inicjowanie jest dość powolne. Jeśli to możliwe, pomaga zdefiniować jeden i użyć go ponownie. To powiedziawszy, czytam to pytanie, ponieważ w moim przypadku nie jest to możliwe.Nie możesz tego zrobić (jeszcze) z interpolacją ciągów. Najlepszym rozwiązaniem będzie nadal formatowanie NSString:
Ekstrapolując z Pythona, wydaje się, że rozsądną składnią może być:
Co następnie pozwala używać ich jako:
Możesz zdefiniować podobne operatory dla wszystkich typów liczbowych, niestety nie znalazłem sposobu, aby to zrobić za pomocą generyków.
Aktualizacja Swift 5
Począwszy od co najmniej Swift 5,
String
bezpośrednio obsługujeformat:
inicjalizator, więc nie trzeba go używać,NSString
a@infix
atrybut nie jest już potrzebny, co oznacza, że powyższe próbki należy zapisać jako:źródło
[NSString stringWithFormat...
Dlaczego to takie skomplikowane? Możesz użyć tego zamiast:
Zobacz, jak działa na placu zabaw.
PS: Rozwiązanie od: http://rrike.sh/xcode/rounding-various-decimal-places-swift/
źródło
Stosowanie
źródło
Bardziej eleganckim i ogólnym rozwiązaniem jest przepisanie
%
operatora ruby / python :źródło
"Hello %@, This is pi : %.2f" % ["World", M_PI]
działa, ale dziwnie"%@ %@" % ["Hello", "World"]
podnosican't unsafeBitCast
... Zgadnij, że zostanie to naprawione w następnej wersji.,
nie jest poprawnym operatorem znaków, w Swift i większości języków. I imo, lepiej jest użyć%
operatora, który już istnieje w innych językach. Zobacz developer.apple.com/library/ios/documentation/Swift/Conceptual/…Szybki 4
źródło
Nadal możesz używać NSLog w Swift jak w Objective-C tylko bez znaku @.
Edycja: Po pracy z Swift od jakiegoś czasu chciałbym również dodać tę odmianę
Wynik:
źródło
Detale
Rozwiązanie 1
func zaokrąglony () -> Podwójny
func zaokrąglony (reguła: FloatingPointRoundingRule) -> Podwójny
mutating func round ()
mutating func round (_ zasada: FloatingPointRoundingRule)
Rozwiązanie 2
Stosowanie
Pełna próbka
Wynik
źródło
źródło
Odpowiedzi udzielone do tej pory, które uzyskały największą liczbę głosów, opierają się na metodach NSString i będą wymagać importu Foundation.
Po wykonaniu tej czynności nadal masz dostęp do NSLog.
Myślę więc, że odpowiedź na pytanie, jeśli pytasz, jak kontynuować używanie NSLog w Swift, to po prostu:
import Foundation
źródło
źródło
tutaj „czyste” szybkie rozwiązanie
źródło
Moc rozszerzenia
Wyjście: prędkość wynosi 12,3
źródło
mniej pisania na klawiaturze:
źródło
W ten sposób możesz również utworzyć operatora
źródło
Również z zaokrągleniem:
źródło
użyj poniższej metody
źródło
Wersja operatora ruby / python% Vincenta Guerci, zaktualizowana do wersji Swift 2.1:
źródło
Wiele dobrych odpowiedzi powyżej, ale czasami wzorzec jest bardziej odpowiedni niż rodzaj „% .3f” gobbledygook. Oto moje ujęcie przy użyciu NumberFormatter w Swift 3.
Tutaj chciałem, aby zawsze były wyświetlane 2 miejsca po przecinku, ale trzeci tylko, jeśli nie był zero.
źródło
Aktualizacja Swift 4 Xcode 10
źródło
Co z rozszerzeniami typów Double i CGFloat:
Stosowanie:
wydruki: 112 465 848 348 508,46
źródło
źródło
Nie wiem o dwóch miejscach po przecinku, ale oto jak drukować liczby zmiennoprzecinkowe z zerowymi miejscami po przecinku, więc wyobrażam sobie, że mogą to być 2 miejsca, 3 miejsca ... (Uwaga: musisz przeliczyć CGFloat na Double, aby przejść na String (format :) lub zobaczy wartość zero)
źródło
Przykład Swift2: szerokość ekranu urządzenia iOS formatującego zmiennoprzecinkowe usuwając liczbę dziesiętną
źródło
@Christian Dietrich:
zamiast:
może to być również:
[korekta:] Przepraszam za zamieszanie * - Oczywiście to działa z Doubles. Myślę, że najbardziej praktyczny (jeśli chcesz, aby cyfry były zaokrąglane, a nie odcinane), byłoby to coś takiego:
Tylko dla Float, po prostu zamień Double na Float, pow na powf i round na roundf.
Aktualizacja: Odkryłem, że najbardziej praktyczne jest użycie zwracanego typu Double zamiast String. Działa to samo dla danych wyjściowych String, tj .:
wypisuje: Pi ma w przybliżeniu 3.142,
więc możesz używać go w ten sam sposób dla napisów (możesz nawet pisać: println (d ~> 2)), ale dodatkowo możesz także użyć go do zaokrąglenia wartości bezpośrednio, tj .:
lub cokolwiek potrzebujesz ...
źródło
posługiwać się
lub
źródło