2012-03-13 15 views
7

Sto tentando di tagliare gli zeri dopo un punto decimale come sotto ma non sta dando il risultato desiderato.Come tagliare gli zeri dopo il punto decimale

trig = [currentVal doubleValue]; 
trig = trig/100; 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:0]; 
display.text = [formatter stringFromNumber:[NSNumber numberWithDouble:trig]]; 

Il numero viene ancora visualizzato senza tagliare zeri dopo il punto decimale.

Qui currentVal è il numero che sto inserendo.

Ad esempio se si passa "trig" = 123 (Inizialmente "trig" = 123 dopo aver eseguito trig/100 voglio visualizzare 1.23 ma viene visualizzato come 1.23000000).

risposta

2

Da documentation, sembra che setFractionDigits: sia solo per la conversione in altro modo.

La cosa migliore da fare è probabilmente convertire il numero in un numero intero prima di formattarlo, ad es.

double converted = round(trig); // man round for docs 

È possibile utilizzare anche le funzioni di formattazione di stringWithFormat: di NSString, ma poi si perde tutti i vantaggi di localizzazione che si ottiene con NSNumberFormatter.

0

perché il tuo tipo di dati non può essere formattato in questo modo.

30

A volte gli specificatori di formato C semplici eseguono un lavoro più semplice delle classi di formattazione Cocoa e possono essere utilizzati nella stringa di formato per il normale messaggio stringWithFormat: su NSString.

Se la vostra esigenza è quella di non mostrare alcun zeri finali, poi la "g" di formato fa il lavoro:

float y = 1234.56789f; 

NSString *s = [NSString stringWithFormat:@"%g", y]; 

Si noti che non ci sono informazioni di precisione, il che significa che la biblioteca printf rimuoverà la il trascinamento si azzera da solo.

Sono disponibili ulteriori informazioni nello docs, che fanno riferimento a IEEE docs.

+3

Grazie, ma se g = 123,2,3141 miliardi in tal caso voglio visualizzare g come 123,23,141 mila – ram

+0

Grazie ... il suo bel lavoro – ram

+0

Funziona bene ma dà forma esponenziale per i grandi numeri e che non voglio che .. Qualche soluzione a questo? – Simmy

3

Questo non mostrerà alcun valore decimale dopo la virgola:

display.text = [NSString stringWithFormat:@"%1.0f", trig]; 

Questo sarà solo tagliare le zeri dopo la virgola:

Nota, questo può lasciare con il trailing punto decimale. "124." può succedere Immagino che presto verrà pubblicata una soluzione più intelligente.

1

Questa potrebbe non essere una soluzione adeguata in cui è presente la classe NSNumberFormetter, ma l'ho appena fatto piuttosto che a googling molto!;)

Ecco un esempio, se aiuta:

-(NSString*) trimZerosAfterDecimalPoint:(NSString*)string_ { 

    double doubleValue=[string_ doubleValue];  
    long leftPart=(long)doubleValue; 
    double rightPart=doubleValue-(double)leftPart; 

    NSString *rightPartAsStr=[NSString stringWithFormat:@"%f", rightPart]; 

    int i=0; 
    for (i=rightPartAsStr.length-1; i>=2; i--) { 
     if ([rightPartAsStr characterAtIndex:i]!='0') {    
      rightPartAsStr=[rightPartAsStr substringWithRange:NSMakeRange(2, i-1)]; 
      break; 
     } 
    } 

    if (i<2) { 
     string_=[NSString stringWithFormat:@"%ld", leftPart]; 
    } else { 
     string_=[NSString stringWithFormat:@"%ld.%@", leftPart, rightPartAsStr]; 
    } 

    return string_; 
} 
1

Ho dovuto farlo per uno dei miei programmi e heres come sono andato su di esso:

- (void) simplify{ 
     int length = (int)[self.calcString length]; 
     for (int i = (int)[self.calcString length]; i > 0; i--) { 
      if ([self.calcString rangeOfString:@"."].location != NSNotFound) { 
       NSRange prevChar = NSMakeRange(i-1, 1); 
       if ([[self.calcString substringWithRange:prevChar] isEqualToString:@"0"]|| 
        [[self.calcString substringWithRange:prevChar] isEqualToString:@"."]) 
        length--; 
       else 
        break; 
     } 
     self.calcString = [self.calcString substringToIndex:length]; 
    } 
} 
1

questo funziona

display.text = [@(trig) stringValue]; 
+2

Forse dovresti aggiungere una spiegazione sul motivo per cui funziona. – jbr

4

Nel caso questo aiuti qualcuno. Volevo 1 valore decimale ma nessun '.0' alla fine se il float era '1.0'. Usando% g darebbe la notazione scientifica per numeri più lunghi, seguendo la bruttezza ha funzionato abbastanza bene per me in quanto l'alta precisione non era critica.

// Convert to 1 dp string, 
NSString* dirtyString = [NSString stringWithFormat: @"%.1f", self.myFloat]; 

// Convert back to float that is now a maximum of 1 dp, 
float myDirtyFloat = [dirtyString floatValue]; 

// Output the float subtracting the zeros the previous step attached 
return [NSString stringWithFormat: @"%g", myDirtyFloat]; 
+0

Fantastico. Grazie mille –

Problemi correlati