Bir şamandıra için yalnızca iki ondalık basamak göster


296

Ben değere sahip 25.00bir 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?


var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (çift: sayı))!
kalpeshdeo

Yanıtlar:


648

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

%.02fbiçimlendiriciye bir kayan nokta ( %f) biçimlendireceğinizi ve bunun iki yere yuvarlanması ve 0s ile doldurulması gerektiğini belirtir .

Örneğin:

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

7
% .2f kullanmanın örnekte 25 değil 25,00 döndürdüğünü fark ettim. Bu garip.
fulvio

3
Her zaman anladığım şekilde, ondalık noktadan sonraki sayı ne kadar ondalık sayıya sahip olduğunuzu söyledi. Yani, .2f gerçekten 25.00 verir ve .4f 25.0000 verir.
Erik S

3
Eğer biri gerçekten nasıl olsun merak ediyorsa 25.. @"%.f"hile yapar. Yukarıda yazılanlar, yazmaz .
Alex Gray

4
@acecapades, eğer kullanırsan@"%.*f", decimalPlaces, number
Jonathan.

12
Muhtemelen bu kısmi bir konu dışı olacak ama ben başka bir biçim eklemek istiyorum:%03.f = 025
SoftDesigner

197

İş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...


Sonuncusu doğru mu? @ "%. 03f" = 3145.566? .560 yerine .566'yı nasıl aldınız?
pixelfreak

ondalık basamak sayısını belirleyen tam sayı değişken olabilir mi? @ @%. xf gibi x burada herhangi bir tam sayı olabilir mi?
acecapades

@ "%. F" ile ilgili sorun yaşıyorsanız @ "%. 0f" komutunu deneyin. Ben diğerinin yoktu ondalık basamak almak için çalıştı buldum
simon_smiley

1
Birisi bana neden sadece% .2f yerine% .02f kullandığınızı söyleyebilir mi?
hinterbu

20

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ı.


Bu kayan sayı numTwoDecimalDigits = atof ([s UTF8String]) gerekir;
loretoparisi

10

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

Bu çözüm CGFloat ile de çalışıyor gibi görünüyor. Müthiş!
eonist

Aradığım şey buydu. Teşekkürler dostum!
Tushar Katyal

9

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

3

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

3

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.


1

objektif -c'de kayan değeri 2 ondalık sayı olarak görüntülemek istiyorsanız, kaç tane ondalık noktayı görüntülemek istediğinizi belirten argümanı iletin, örneğin 0.02f yazdırılacaktır 25.00 0.002f 25.000


1

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)


Bu çok iyi bir çözüm, çok teşekkürler. Bana nasıl çalıştığını açıklayabilir misin? Ekstra '%' sembolü eklediğinizi görüyorum.
Eugene Alexeev

1

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


1
@Bilinmeyen downvoter bu swift için çalışan bir çözümdür ve aynı zamanda swift için diğer cevaplardan farklıdır, neden?
Aks

bir şamandıra döndürebilirseniz her zaman bir CGFloat'a dönüştürebilirsiniz
eonist

1

Kullanım NSNumberFormatterile maximumFractionDigitsaşağıdaki gibi:

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

Ve alacaksın 12.35


0

Değeri de yüzdürmeniz gerekiyorsa:

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

0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.