Ho il valore 25.00
in a float
, ma quando lo stampo sullo schermo lo è 25.0000000
.
Come posso visualizzare il valore con solo due cifre decimali?
Ho il valore 25.00
in a float
, ma quando lo stampo sullo schermo lo è 25.0000000
.
Come posso visualizzare il valore con solo due cifre decimali?
Risposte:
Non è una questione di come viene memorizzato il numero, ma di come lo si sta visualizzando. Quando lo converti in una stringa devi arrotondare alla precisione desiderata, che nel tuo caso è due cifre decimali.
Per esempio:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
dice al formattatore che formatterai un float ( %f
) e, che dovrebbe essere arrotondato in due punti, e deve essere riempito con 0
s.
Per esempio:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
... @"%.f"
fa il trucco. Ciò che è scritto sopra, no .
@"%.*f", decimalPlaces, number
%03.f = 025
Ecco alcune correzioni-
//for 3145.559706
Swift 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"
e così via...
Puoi anche provare a usare NSNumberFormatter:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
Potrebbe essere necessario impostare anche il formato negativo, ma penso che sia abbastanza intelligente da capirlo.
Ho fatto una rapida estensione in base alle risposte sopra
extension Float {
func round(decimalPlace:Int)->Float{
let format = NSString(format: "%%.%if", decimalPlace)
let string = NSString(format: format, self)
return Float(atof(string.UTF8String))
}
}
utilizzo:
let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
In Swift Language, se vuoi mostrare devi usarlo in questo modo. Per assegnare un doppio valore in UITextView, ad esempio:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
Se vuoi mostrare in LOG come obiettivo-c usando NSLog (), allora in Swift Language puoi farlo in questo modo:
println(NSString(format:"%.2f", result))
IN goal-c, se hai a che fare con normali array di caratteri (anziché puntatori a NSString) puoi anche usare:
printf("%.02f", your_float_var);
OTOH, se quello che vuoi è archiviare quel valore su un array di caratteri puoi usare:
sprintf(your_char_ptr, "%.02f", your_float_var);
Il problema con tutte le risposte è che moltiplicare e poi dividere i risultati in problemi di precisione perché hai usato la divisione. L'ho imparato molto tempo fa dalla programmazione su un PDP8. Il modo per risolverlo è:
return roundf(number * 100) * .01;
Quindi 15.6578 restituisce solo 15.66 e non 15.6578999 o qualcosa del genere non voluto.
Quale livello di precisione vuoi dipende da te. Basta non dividere il prodotto, moltiplicarlo per l'equivalente decimale. Nessuna conversione di stringa divertente richiesta.
Ecco alcuni metodi per formattare dinamicamente secondo una precisione:
+ (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;
}
}
per esempio
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
=> 2.3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=> 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=> 2.35 (arrotondamento per eccesso)
Un altro metodo per Swift (senza usare NSString):
let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
PS questa soluzione non funziona con il tipo CGFloat testato solo con Float
&Double
Utilizzare NSNumberFormatter
con maximumFractionDigits
come di seguito:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
E otterrai 12.35
Se è necessario anche il float del valore:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];