Eu tenho o valor 25.00
em a float
, mas quando imprimo na tela é 25.0000000
.
Como posso exibir o valor com apenas duas casas decimais?
Eu tenho o valor 25.00
em a float
, mas quando imprimo na tela é 25.0000000
.
Como posso exibir o valor com apenas duas casas decimais?
Respostas:
Não é uma questão de como o número é armazenado, é uma questão de como você o está exibindo. Ao convertê-lo em uma sequência, você deve arredondar para a precisão desejada, que no seu caso tem duas casas decimais.
Por exemplo:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
informa ao formatador que você estará formatando um float ( %f
) e, que deve ser arredondado para dois lugares e deve ser preenchido com 0
s.
Por exemplo:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
... @"%.f"
faz o truque. O que está escrito acima, não .
@"%.*f", decimalPlaces, number
%03.f = 025
Aqui estão algumas correções -
//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 assim por diante...
Você também pode tentar usar o NSNumberFormatter:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
Você pode precisar também definir o formato negativo, mas acho que é inteligente o suficiente para descobrir.
Fiz uma extensão rápida com base nas respostas acima
extension Float {
func round(decimalPlace:Int)->Float{
let format = NSString(format: "%%.%if", decimalPlace)
let string = NSString(format: format, self)
return Float(atof(string.UTF8String))
}
}
uso:
let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
No Swift Language, se você deseja mostrar, precisa usá-lo dessa maneira. Para atribuir valor duplo no UITextView, por exemplo:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
Se você deseja mostrar no LOG como o objetivo-c faz usando o NSLog (), em Swift Language você pode fazer o seguinte:
println(NSString(format:"%.2f", result))
No objetivo-c, se você estiver lidando com matrizes de caracteres regulares (em vez de ponteiros para o NSString), também poderá usar:
printf("%.02f", your_float_var);
OTOH, se o que você deseja é armazenar esse valor em uma matriz de caracteres, você pode usar:
sprintf(your_char_ptr, "%.02f", your_float_var);
O problema com todas as respostas é que multiplicar e depois dividir resulta em problemas de precisão porque você usou a divisão. Aprendi isso há muito tempo com a programação em um PDP8. A maneira de resolver isso é:
return roundf(number * 100) * .01;
Assim, 15.6578 retorna apenas 15.66 e não 15.6578999 ou algo não intencional assim.
Qual o nível de precisão que você deseja depende de você. Apenas não divida o produto, multiplique-o pelo equivalente decimal. Não é necessária nenhuma conversão engraçada de strings.
Aqui estão alguns métodos para formatar dinamicamente de acordo com uma precisão:
+ (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;
}
}
por exemplo
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
=> 2.3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=> 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=> 2,35 (arredondado para cima)
Outro método para Swift (sem usar o NSString):
let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
PS: esta solução não está funcionando com o tipo CGFloat testado apenas com Float
&Double
Use NSNumberFormatter
com maximumFractionDigits
como abaixo:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
E você terá 12.35
Se você também precisar flutuar valor:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];