Я маю значення 25.00
у float
, але коли я друкую його на екрані, воно є 25.0000000
.
Як я можу відобразити значення лише з двома знаками після коми?
Я маю значення 25.00
у float
, але коли я друкую його на екрані, воно є 25.0000000
.
Як я можу відобразити значення лише з двома знаками після коми?
Відповіді:
Справа не в тому, як зберігається номер, це в тому, як ви його відображаєте. Перетворюючи його в рядок, ви повинні округлити до потрібної точності, яка у вашому випадку становить два десяткових знаки.
Наприклад:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
повідомляє форматувальнику, що ви будете форматувати float ( %f
) і, що його слід округлити до двох місць, і його слід залити 0
s.
Наприклад:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
робить трюк. Те, що написано вище, не робить .
@"%.*f", decimalPlaces, number
%03.f = 025
Ось кілька виправлень -
//for 3145.559706
Швидкий 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"
і так далі...
Ви також можете спробувати використовувати NSNumberFormatter:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
Можливо, вам також потрібно встановити негативний формат, але я думаю, що це досить розумно, щоб це зрозуміти.
Я зробив швидке розширення на основі вищезазначених відповідей
extension Float {
func round(decimalPlace:Int)->Float{
let format = NSString(format: "%%.%if", decimalPlace)
let string = NSString(format: format, self)
return Float(atof(string.UTF8String))
}
}
використання:
let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
У Swift Language, якщо ви хочете показати, вам потрібно використовувати це таким чином. Наприклад, щоб призначити подвійне значення в UITextView, наприклад:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
Якщо ви хочете показати в LOG, як, як Objective-c робить NSLog (), то в мові Swift ви можете зробити так:
println(NSString(format:"%.2f", result))
У мета-c, якщо ви маєте справу з регулярними масивами знаків (замість покажчиків на NSString), ви також можете використовувати:
printf("%.02f", your_float_var);
OTOH, якщо ви хочете зберегти це значення в масиві char, який ви могли б використовувати:
sprintf(your_char_ptr, "%.02f", your_float_var);
Проблема з усіма відповідями полягає в тому, що множення та розподіл результатів на питання точності, оскільки ви використовували поділ. Я дізнався це давно з програмування на PDP8. Спосіб вирішити це:
return roundf(number * 100) * .01;
Таким чином, 15.6578 повертає всього 15.66, а не 15.6578999 або щось подібне ненавмисне.
Який рівень точності ви хочете, залежить від вас. Просто не діліть продукт, а помножте його на десятковий еквівалент. Не потрібно забавного перетворення рядків.
Ось кілька методів для динамічного форматування відповідно до точності:
+ (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;
}
}
напр
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
=> 2,3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=> 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=> 2,35 (округлення)
Інший метод для Swift (без використання NSString):
let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
PS це рішення не працює з типом CGFloat лише тестованим Float
&Double
Використовуйте NSNumberFormatter
з , maximumFractionDigits
як показано нижче:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
І ви отримаєте 12.35
Якщо вам також потрібно пропустити значення:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];