Ben değere sahip 25.00
bir yer float
, ama ben ekranda yazdırmak yaparken olduğu 25.0000000
.
Değeri yalnızca iki ondalık basamakla nasıl görüntüleyebilirim?
Ben değere sahip 25.00
bir yer float
, ama ben ekranda yazdırmak yaparken olduğu 25.0000000
.
Değeri yalnızca iki ondalık basamakla nasıl görüntüleyebilirim?
Yanıtlar:
Bu sayının nasıl saklandığı değil, nasıl görüntülediğinizle ilgilidir. Bir dizgeye dönüştürürken, istediğiniz ondalık basamak olan istenen hassasiyete yuvarlamanız gerekir.
Örneğin:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
biçimlendiriciye bir kayan nokta ( %f
) biçimlendireceğinizi ve bunun iki yere yuvarlanması ve 0
s ile doldurulması gerektiğini belirtir .
Örneğin:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
hile yapar. Yukarıda yazılanlar, yazmaz .
@"%.*f", decimalPlaces, number
%03.f = 025
İşte birkaç düzeltme-
//for 3145.559706
Hızlı 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"
ve bunun gibi...
NSNumberFormatter'ı kullanmayı da deneyebilirsiniz:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
Negatif formatı da ayarlamanız gerekebilir, ancak bence anlamaya yetecek kadar akıllı.
Yukarıdaki cevaplara dayanarak hızlı bir uzantı yaptım
extension Float {
func round(decimalPlace:Int)->Float{
let format = NSString(format: "%%.%if", decimalPlace)
let string = NSString(format: format, self)
return Float(atof(string.UTF8String))
}
}
kullanımı:
let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
Swift Language'de, göstermek istiyorsanız onu bu şekilde kullanmanız gerekir. Örneğin, UITextView uygulamasında çift değer atamak için:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
LOG'da, object-c'nin NSLog () kullanarak yaptığı gibi göstermek istiyorsanız, Swift Language'de şu şekilde yapabilirsiniz:
println(NSString(format:"%.2f", result))
Objektif-c'de, düzenli karakter dizileriyle uğraşıyorsanız (NSString'e işaretçiler yerine) şunları da kullanabilirsiniz:
printf("%.02f", your_float_var);
OTOH, istediğiniz değeri kullanabileceğiniz bir char dizisinde saklamaksa:
sprintf(your_char_ptr, "%.02f", your_float_var);
Tüm cevapların sorunu, bölme kullandığınız için çarpma ve bölme işleminin hassas sorunlarla sonuçlanmasıdır. Bunu uzun zaman önce bir PDP8 üzerinde programlayarak öğrendim. Bunu çözmenin yolu:
return roundf(number * 100) * .01;
Böylece 15.6578 sadece 15.66 döndürür ve 15.6578999 veya böyle istenmeyen bir şey döndürmez.
İstediğiniz hassasiyet düzeyi size bağlıdır. Sadece ürünü bölmeyin, ondalık eşdeğeriyle çarpın. Komik String dönüştürme gerekmez.
Hassaslığa göre dinamik olarak biçimlendirmek için bazı yöntemler şunlardır:
+ (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;
}
}
Örneğin
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
=> 2.3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=> 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=> 2,35 (yuvarla)
Swift için başka bir yöntem (NSString kullanmadan):
let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
PS bu çözüm CGFloat türü ile çalışmıyor sadece Float
&Double
Kullanım NSNumberFormatter
ile maximumFractionDigits
aşağıdaki gibi:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
Ve alacaksın 12.35
Değeri de yüzdürmeniz gerekiyorsa:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];