Зробіть поплавком лише два знаки після коми


296

Я маю значення 25.00у float, але коли я друкую його на екрані, воно є 25.0000000.
Як я можу відобразити значення лише з двома знаками після коми?


var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (подвійний: число))!
kalpeshdeo

Відповіді:


648

Справа не в тому, як зберігається номер, це в тому, як ви його відображаєте. Перетворюючи його в рядок, ви повинні округлити до потрібної точності, яка у вашому випадку становить два десяткових знаки.

Наприклад:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

%.02fповідомляє форматувальнику, що ви будете форматувати float ( %f) і, що його слід округлити до двох місць, і його слід залити 0s.

Наприклад:

%f = 25.000000
%.f = 25
%.02f = 25.00

7
Я помітив, що використання% .2f насправді повертає 25,00 у вашому прикладі, а не 25. Це дивно.
фульвіо

3
Я завжди розумів, що число після десяткової крапки означало скільки десяткових знаків ви отримали. Отже, .2f справді дасть 25.00, а .4f - 25.0000.
Erik S

3
Якщо комусь цікаво , як насправді дістатися 25 .. @"%.f"робить трюк. Те, що написано вище, не робить .
Алекс Грей

4
@acecapades, якщо ви використовуєте@"%.*f", decimalPlaces, number
Джонатан.

12
Можливо, це буде частково поза темою, але я б додав інший формат:%03.f = 025
SoftDesigner

197

Ось кілька виправлень -

//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"

і так далі...


Чи є останній точним? @ "%. 03f" = 3145.566? Як ти отримав .566 замість .560?
pixelfreak

може ціле число, яке визначає кількість десяткових знаків, бути змінною? як @ "%. xf", де x може бути будь-яким цілим числом?
acecapades

Якщо у вас виникли проблеми з @ "%. F", спробуйте @ "%. 0f". Я виявив, що це спрацювало, щоб не було десяткових знаків, де іншого не було
simon_smiley

1
Хто-небудь може сказати мені, чому ви б використовували% .02f замість просто% .2f?
hinterbu

20

Ви також можете спробувати використовувати NSNumberFormatter:

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];

Можливо, вам також потрібно встановити негативний формат, але я думаю, що це досить розумно, щоб це зрозуміти.


вам потрібен цей плаваючий номерTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi

10

Я зробив швидке розширення на основі вищезазначених відповідей

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

Це рішення також, здається, працює з CGFloat. Дивовижно!
еоніст

Це те, що я шукав. Дякую, друже!
Тушар Катяль

9

У Swift Language, якщо ви хочете показати, вам потрібно використовувати це таким чином. Наприклад, щоб призначити подвійне значення в UITextView, наприклад:

let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)

Якщо ви хочете показати в LOG, як, як Objective-c робить NSLog (), то в мові Swift ви можете зробити так:

println(NSString(format:"%.2f", result))

3

У мета-c, якщо ви маєте справу з регулярними масивами знаків (замість покажчиків на NSString), ви також можете використовувати:

printf("%.02f", your_float_var);

OTOH, якщо ви хочете зберегти це значення в масиві char, який ви могли б використовувати:

sprintf(your_char_ptr, "%.02f", your_float_var);

3

Проблема з усіма відповідями полягає в тому, що множення та розподіл результатів на питання точності, оскільки ви використовували поділ. Я дізнався це давно з програмування на PDP8. Спосіб вирішити це:

return roundf(number * 100) * .01;

Таким чином, 15.6578 повертає всього 15.66, а не 15.6578999 або щось подібне ненавмисне.

Який рівень точності ви хочете, залежить від вас. Просто не діліть продукт, а помножте його на десятковий еквівалент. Не потрібно забавного перетворення рядків.


1

в цілі -c ви хочете відобразити значення з плаваючою ознакою у 2 десяткових числах, тоді передайте аргумент, який вказує, скільки десяткових знаків ви хочете відобразити, наприклад, 0,02f буде надруковано 25,00 0,002f надрукує 25,000


1

Ось кілька методів для динамічного форматування відповідно до точності:

+ (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 (округлення)


Це дуже вдале рішення, велике спасибі. Чи можете ви пояснити мені, як це працює? Я бачу, що ви додали додатковий символ "%".
Євген Алексєєв

1

Інший метод для Swift (без використання NSString):

let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")

PS це рішення не працює з типом CGFloat лише тестованим Float&Double


1
@ Невідомий downvoter це робоче рішення для швидкого & також відрізняється від інших відповідей на swift, так чому?
Акс

якщо ви можете повернути float, ви завжди можете його перетворити на CGFloat
еоніст

1

Використовуйте NSNumberFormatterз , maximumFractionDigitsяк показано нижче:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);

І ви отримаєте 12.35


0

Якщо вам також потрібно пропустити значення:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.