ฉันมีค่า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 หากคุณต้องการแสดงให้เห็นว่าคุณต้องใช้มันในวิธีนี้ ในการกำหนดค่าสองเท่าใน UITextView ตัวอย่างเช่น:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
หากคุณต้องการที่จะแสดงใน LOG เหมือนอย่างมีวัตถุประสงค์ -c ใช้ NSLog () จากนั้นในภาษา Swift คุณสามารถทำสิ่งนี้ได้:
println(NSString(format:"%.2f", result))
ในวัตถุประสงค์ -c หากคุณกำลังจัดการกับอาร์เรย์ char ปกติ (แทนที่จะเป็นตัวชี้ไปยัง 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 หรือสิ่งที่ไม่ได้ตั้งใจเช่นนั้น
ระดับความแม่นยำที่คุณต้องการนั้นขึ้นอยู่กับคุณ เพียงอย่าแบ่งผลิตภัณฑ์คูณมันด้วยจำนวนทศนิยมที่เท่ากัน ไม่มีการแปลงสตริงที่ตลก
ในวัตถุประสงค์ -c คือคุณต้องการแสดงค่าทศนิยมเป็นจำนวนทศนิยม 2 ตัวจากนั้นผ่านอาร์กิวเมนต์เพื่อระบุจำนวนทศนิยมที่คุณต้องการแสดงเช่น 0.02f จะพิมพ์ 25.00 0.002f จะพิมพ์ 25.000
ต่อไปนี้เป็นวิธีการจัดรูปแบบไดนามิกตามความแม่นยำ:
+ (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]];