Mam wartość 25.00
w float
, ale kiedy drukuję to na ekranie, jest 25.0000000
.
Jak mogę wyświetlić wartość tylko z dwoma miejscami po przecinku?
Mam wartość 25.00
w float
, ale kiedy drukuję to na ekranie, jest 25.0000000
.
Jak mogę wyświetlić wartość tylko z dwoma miejscami po przecinku?
Odpowiedzi:
To nie jest kwestia sposobu przechowywania numeru, to kwestia sposobu jego wyświetlania. Konwertując go na ciąg, należy zaokrąglić do pożądanej precyzji, która w Twoim przypadku to dwa miejsca po przecinku.
Na przykład:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
mówi formatyzatorowi, że sformatujesz zmiennoprzecinkową ( %f
) i że należy go zaokrąglić do dwóch miejsc i uzupełnić klawiszem 0
s.
Na przykład:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
... @"%.f"
robi lewę. To, co napisano powyżej, nie ma .
@"%.*f", decimalPlaces, number
%03.f = 025
Oto kilka poprawek
//for 3145.559706
Szybki 3
let num: CGFloat = 3145.559706
print(String(format: "%f", num)) = 3145.559706
print(String(format: "%.f", num)) = 3145
print(String(format: "%.1f", num)) = 3145.6
print(String(format: "%.2f", num)) = 3145.56
print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f"
print(String(format: "%.3f", num)) = 3145.560
print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"
Obj-C
@"%f" = 3145.559706
@"%.f" = 3146
@"%.1f" = 3145.6
@"%.2f" = 3145.56
@"%.02f" = 3145.56 // which is equal to @"%.2f"
@"%.3f" = 3145.560
@"%.03f" = 3145.560 // which is equal to @"%.3f"
i tak dalej...
Możesz także spróbować użyć NSNumberFormatter:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
Być może trzeba również ustawić format ujemny, ale myślę, że jest wystarczająco inteligentny, aby to rozgryźć.
Zrobiłem szybkie rozszerzenie w oparciu o powyższe odpowiedzi
extension Float {
func round(decimalPlace:Int)->Float{
let format = NSString(format: "%%.%if", decimalPlace)
let string = NSString(format: format, self)
return Float(atof(string.UTF8String))
}
}
stosowanie:
let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
W Swift Language, jeśli chcesz pokazać, musisz go używać w ten sposób. Aby przypisać podwójną wartość w UITextView, na przykład:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
Jeśli chcesz wyświetlać w LOG podobnie jak cel c przy użyciu NSLog (), to w Swift Language możesz to zrobić w następujący sposób:
println(NSString(format:"%.2f", result))
W celu-c, jeśli masz do czynienia ze zwykłymi tablicami znaków (zamiast wskaźników do NSString), możesz również użyć:
printf("%.02f", your_float_var);
OTOH, jeśli chcesz przechowywać tę wartość w tablicy char, której możesz użyć:
sprintf(your_char_ptr, "%.02f", your_float_var);
Problem z wszystkimi odpowiedziami polega na tym, że mnożenie, a następnie dzielenie wyników w kwestiach precyzji, ponieważ użyłeś podziału. Nauczyłem się tego dawno temu z programowania na PDP8. Sposobem na rozwiązanie tego jest:
return roundf(number * 100) * .01;
Zatem 15.6578 zwraca tylko 15,66, a nie 15.6578999 lub coś niezamierzonego.
Jaki poziom precyzji zależy od Ciebie. Po prostu nie dziel produktu, pomnóż go przez ekwiwalent dziesiętny. Nie jest wymagana żadna śmieszna konwersja ciągów.
Oto kilka metod dynamicznego formatowania zgodnie z precyzją:
+ (NSNumber *)numberFromString:(NSString *)string
{
if (string.length) {
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
return [f numberFromString:string];
} else {
return nil;
}
}
+ (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision
{
NSNumber *numberValue = [self numberFromString:string];
if (numberValue) {
NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision];
return [NSString stringWithFormat:formatString, numberValue.floatValue];
} else {
/* return original string */
return string;
}
}
na przykład
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
=> 2,3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=> 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=> 2,35 (zaokrąglenie w górę)
Kolejna metoda dla Swift (bez użycia NSString):
let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
PS to rozwiązanie nie działa z typem CGFloat przetestowanym tylko z Float
&Double
Użyj NSNumberFormatter
z maximumFractionDigits
jak poniżej:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
I dostaniesz 12.35
Jeśli chcesz również zmienić wartość:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];