Tạo một float chỉ hiển thị hai chữ số thập phân


296

Tôi có giá trị 25.00trong một float, nhưng khi tôi in nó trên màn hình 25.0000000.
Làm cách nào tôi có thể hiển thị giá trị chỉ với hai chữ số thập phân?


var nf = NSNumberFormatter () nf.poseitiveFormat = "0. ##" var numberAfterRound = nf.opesFromNumber (NSNumber (double: number))!
kalpeshdeo

Câu trả lời:


648

Đây không phải là vấn đề về cách số được lưu trữ, mà là vấn đề bạn hiển thị nó như thế nào. Khi chuyển đổi nó thành một chuỗi, bạn phải làm tròn đến độ chính xác mong muốn, trong trường hợp của bạn là hai chữ số thập phân.

Ví dụ:

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

%.02fbáo cho bộ định dạng rằng bạn sẽ định dạng một float ( %f) và, nên được làm tròn thành hai vị trí và nên được đệm bằng 0s.

Ví dụ:

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

7
Tôi nhận thấy rằng việc sử dụng% .2f thực sự trả về 25,00 trong ví dụ của bạn chứ không phải 25. Điều này thật lạ.
Fulvio

3
Cách tôi luôn hiểu là con số sau dấu thập phân cho biết bạn nhận được bao nhiêu số thập phân. Vì vậy, .2f thực sự sẽ cung cấp 25.00 và .4f sẽ cung cấp 25.0000.
Erik S

3
Nếu bất cứ ai tò mò về cách một người thực sự nhận được 25 .. @"%.f"thì lừa. Những gì được viết ở trên, không .
Alex Gray

4
@acecapades, nếu bạn sử dụng@"%.*f", decimalPlaces, number
Jonathan.

12
Có lẽ đây sẽ là một chủ đề ngoài chủ đề nhưng tôi sẽ thêm một định dạng khác:%03.f = 025
SoftDesigner

197

Dưới đây là một vài sửa chữa-

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

và như thế...


Là cái cuối cùng chính xác? @ "%. 03f" = 3145.566? Làm thế nào bạn có được 0,55 thay vì 0,55?
pixelfreak

số nguyên xác định số vị trí thập phân có thể là một biến không? như @ "%. xf" trong đó x có thể là số nguyên nào?
acecapades

Nếu bạn gặp vấn đề với @ "%. F" thì hãy thử @ "%. 0f". Tôi thấy điều này hoạt động để không có vị trí thập phân trong khi cái kia không
simon_smiley

1
Ai đó có thể cho tôi biết lý do tại sao bạn sẽ sử dụng% .02f thay vì chỉ% .2f không?
hinterbu

20

Bạn cũng có thể thử sử dụng NSNumberFormatter:

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

Bạn cũng có thể cần phải đặt định dạng phủ định, nhưng tôi nghĩ nó đủ thông minh để tìm ra định dạng đó.


bạn cần float numTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi

10

Tôi đã thực hiện một phần mở rộng nhanh chóng dựa trên các câu trả lời ở trên

extension Float {
    func round(decimalPlace:Int)->Float{
        let format = NSString(format: "%%.%if", decimalPlace)
        let string = NSString(format: format, self)
        return Float(atof(string.UTF8String))
    }
}

sử dụng:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true

Giải pháp này dường như cũng hoạt động với CGFloat. Tuyệt vời!
eonist

Đây là những gì tôi đang tìm kiếm. Cảm ơn bạn đời!
Tushar Katyal

9

Trong Ngôn ngữ Swift, nếu bạn muốn hiển thị, bạn cần sử dụng nó theo cách này. Để gán giá trị kép trong UITextView, ví dụ:

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

Nếu bạn muốn hiển thị trong LOG như là object-c sử dụng NSLog (), thì trong Ngôn ngữ Swift, bạn có thể thực hiện theo cách này:

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

3

Ở mục tiêu-c, nếu bạn đang xử lý các mảng char thông thường (thay vì con trỏ tới NSString), bạn cũng có thể sử dụng:

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

OTOH, nếu điều bạn muốn là lưu trữ giá trị đó trên một mảng char bạn có thể sử dụng:

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

3

Vấn đề với tất cả các câu trả lời là nhân và sau đó chia kết quả trong các vấn đề chính xác vì bạn đã sử dụng phép chia. Tôi đã học được điều này từ lâu từ lập trình trên PDP8. Cách để giải quyết vấn đề này là:

return roundf(number * 100) * .01;

Do đó, 15,6578 trả về chỉ 15,66 chứ không phải 15,6578999 hoặc một cái gì đó ngoài ý muốn như thế.

Mức độ chính xác bạn muốn là tùy thuộc vào bạn. Chỉ không chia sản phẩm, nhân nó với số thập phân tương đương. Không yêu cầu chuyển đổi chuỗi vui.


1

trong mục tiêu -c là bạn muốn hiển thị giá trị float trong 2 số thập phân sau đó chuyển đối số cho biết bạn muốn hiển thị bao nhiêu điểm thập phân, ví dụ 0,02f sẽ in 25,00 0,002f sẽ in 25.000


1

Đây là một số phương pháp để định dạng động theo độ chính xác:

+ (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;
    }
}

ví dụ

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];

=> 2.3453

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];

=> 2

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];

=> 2,35 (làm tròn lên)


Đó là giải pháp rất tốt, cảm ơn rất nhiều. Bạn có thể giải thích cho tôi làm thế nào nó hoạt động? Tôi thấy bạn đã thêm biểu tượng '%'.
Eugene Alexeev

1

Một phương pháp khác cho Swift (không sử dụng NSString):

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

PS giải pháp này không hoạt động với loại CGFloat chỉ được thử nghiệm với Float&Double


1
@Un Unknown downvoter đây là giải pháp làm việc cho swift & cũng khác với các câu trả lời khác cho swift vậy tại sao?
Aks

nếu bạn có thể trả lại một float, bạn luôn có thể chuyển đổi nó thành CGFloat
eonist

1

Sử dụng NSNumberFormattervới maximumFractionDigitsnhư dưới đây:

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

Và bạn sẽ nhận được 12.35


0

Nếu bạn cần thả nổi giá trị là tốt:

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

0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.