Tôi có giá trị 25.00
trong 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?
Tôi có giá trị 25.00
trong 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?
Câu trả lời:
Đâ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];
%.02f
bá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 0
s.
Ví dụ:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
thì lừa. Những gì được viết ở trên, không .
@"%.*f", decimalPlaces, number
%03.f = 025
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ế...
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 đó.
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
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))
Ở 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);
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.
Đâ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)
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
Sử dụng NSNumberFormatter
với maximumFractionDigits
như 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
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]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];