3 Stimmen

Ermittlung der ersten drei Ziffern von int/float

Ich möchte die ersten drei Ziffern von großen Gleitkommazahlen oder ganzen Zahlen erhalten und bei einigen eine Dezimalstelle einfügen. Zum Beispiel:

KB
----------
32589 >> 325
43266 >> 432

MB
----------
1234599 >> 1.23
3422847 >> 3.42

Für die jeweilige Nummer habe ich die Zeichenfolgen "KB" und "MB". So weiß ich, ob die Dezimalstelle erforderlich ist, wie in den "MB"-Beispielen. Ich sah NSNumberFormatter, aber war nicht sicher, was dort helfen würde. Irgendwelche Vorschläge?

7voto

e.James Punkte 112528

Hier ist einige schnelle & schmutzigen Code, um die ersten drei Ziffern der Zahl (in NSString-Format) zu ziehen:

long someNumber = 1234599;
NSString * allDigits = [NSString stringWithFormat:@"%l", someNumber];
NSString * topDigits = [allDigits substringToIndex:3];

NSLog(@"%@", topDigits); // will output 123

6voto

glenn jackman Punkte 221248

Wollen Sie damit sagen, dass 32589 Bytes 325 KB sind?

Wäre es nicht sinnvoll, die Zahl wiederholt durch 1000 zu teilen, bis das Ergebnis kleiner als 1000 ist, und dann mit einem beliebigen printf-Äquivalent zu formatieren, das Sie haben?

6voto

Jim Dovey Punkte 11106

Ich habe beschlossen, mich mit meiner eigenen Antwort einzuschalten. Dies ist meine Routine zur Erzeugung von Zeichenketten für die Ausgabe von menschlichen Größen aus Byte-Zahlen:

#include <math.h>    // for isgreater()
static NSString * MemorySizeString( mach_vm_size_t size )
{
    enum
    {
        kSizeIsBytes        = 0,
        kSizeIsKilobytes,
        kSizeIsMegabytes,
        kSizeIsGigabytes,
        kSizeIsTerabytes,
        kSizeIsPetabytes,
        kSizeIsExabytes
    };

    int sizeType = kSizeIsBytes;
    double dSize = (double) size;

    while ( isgreater(dSize, 1024.0) )
    {
        dSize = dSize / 1024.0;
        sizeType++;
    }

    NSMutableString * str = [[NSMutableString alloc] initWithFormat: (sizeType == kSizeIsBytes ? @"%.00f" : @"%.02f"), dSize];
    switch ( sizeType )
    {
        default:
        case kSizeIsBytes:
            [str appendString: @" bytes"];
            break;

        case kSizeIsKilobytes:
            [str appendString: @"KB"];
            break;

        case kSizeIsMegabytes:
            [str appendString: @"MB"];
            break;

        case kSizeIsGigabytes:
            [str appendString: @"GB"];
            break;

        case kSizeIsTerabytes:
            [str appendString: @"TB"];
            break;

        case kSizeIsPetabytes:
            [str appendString: @"PB"];
            break;

        case kSizeIsExabytes:
            [str appendString: @"EB"];
            break;
    }

    NSString * result = [str copy];
    [str release];

    return ( [result autorelease] );
}

Die korrekte Größe wird anhand der binären Größenordnung ermittelt, wobei 1024 als Basis verwendet wird (1024 Bytes = 1KB, 1024KB = 1MB usw.). Dabei wird der Eingabewert (mit Hilfe von Fließkomma-Arithmetik) so verkleinert, dass er, sobald er unter 1024 liegt, sowohl einen für Menschen lesbaren Wert als auch eine Größenangabe hat. Anschließend wird eine Zeichenkette erzeugt, die den formatierten Wert enthält (keine Nachkommastellen für Bytes, 2 Nachkommastellen für jede größere Größe), und die Größenkonstante wird untersucht, um festzustellen, welches Suffix angehängt werden soll.

1voto

Joe Corkery Punkte 2506

Sie können dies tun, indem Sie die Zahl mit itoa oder sprintf in eine Textdarstellung umwandeln oder Ihre eigene Version dieser Umwandlungstechnik implementieren. Sobald dies geschehen ist, können Sie die ersten drei Zeichen aus dem Textpuffer entnehmen und verwenden.

1voto

ennuikiller Punkte 44945

Der einfachste Weg, damit umzugehen, ist die Konvertierung in einen String und die Verwendung einer der cocoadev Regex-Bibliotheken für die Formatierung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X