ทำให้ทุ่นแสดงทศนิยมสองตำแหน่งเท่านั้น


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 นี่เป็นเรื่องแปลก
fulvio

3
วิธีที่ฉันเข้าใจอยู่เสมอคือจำนวนหลังจุดทศนิยมนั้นบอกว่าคุณได้ทศนิยมเท่าไหร่ ดังนั้น. 2f จะให้ 25.00 และ. 4f จะให้ 25.0000
Erik S

3
หากใครอยากรู้อยากเห็นว่าใคร ได้รับจริง 25 .. @"%.f"ทำเคล็ดลับ สิ่งที่เขียนข้างต้นไม่ได้
Alex Grey

4
@acecapades ถ้าคุณใช้@"%.*f", decimalPlaces, number
Jonathan

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 แทนที่จะเป็น.
hinterbu

20

คุณสามารถลองใช้ NSNumberFormatter:

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

คุณอาจต้องกำหนดรูปแบบเชิงลบด้วย แต่ฉันคิดว่ามันฉลาดพอที่จะเข้าใจได้


คุณต้องการโฟลตนี้ numTwoDecimalDigits = 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 ! น่ากลัว
eonist

นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณเพื่อน!
Tushar Katyal

9

ในภาษา Swift หากคุณต้องการแสดงให้เห็นว่าคุณต้องใช้มันในวิธีนี้ ในการกำหนดค่าสองเท่าใน UITextView ตัวอย่างเช่น:

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

หากคุณต้องการที่จะแสดงใน LOG เหมือนอย่างมีวัตถุประสงค์ -c ใช้ NSLog () จากนั้นในภาษา Swift คุณสามารถทำสิ่งนี้ได้:

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

3

ในวัตถุประสงค์ -c หากคุณกำลังจัดการกับอาร์เรย์ char ปกติ (แทนที่จะเป็นตัวชี้ไปยัง 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 (ปัดเศษขึ้น)


นั่นเป็นทางออกที่ดีมากขอบคุณมาก คุณช่วยอธิบายให้ฉันฟังว่ามันทำงานอย่างไร ฉันเห็นว่าคุณได้เพิ่มสัญลักษณ์ '%' พิเศษ
Eugene Alexeev

1

วิธีการอื่นสำหรับSwift (โดยไม่ใช้ NSString):

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

PS โซลูชันนี้ไม่ทำงานกับประเภทCGFloatทดสอบเฉพาะกับFloat&Double


1
@ ไม่รู้จัก downvoter นี่เป็นวิธีแก้ปัญหาสำหรับ swift และยังแตกต่างจากคำตอบอื่น ๆ สำหรับ swift ดังนั้นทำไม?
Aks

ถ้าคุณสามารถกลับลอยคุณสามารถแปลงเป็น CGFloat
eonist

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]);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.