2009-05-06 2 views
8

Скажем, у меня есть большое количество (целое или с плавающей точкой), как 12345. и я хочу, чтобы это выглядело как 12,345.Форматирование (большой) номер «12345» на «12345»

Как бы это осуществить?

Я пытаюсь сделать это для iPhone-приложения, поэтому что-то в Objective-C или C было бы хорошо.

+0

Есть также некоторые хорошие ответы здесь: [? Как добавить запятые на номер каждые 3 цифры в Objective C] (http://stackoverflow.com/questions/2233824/how-to-add-commas- к числу-каждому-3-цифра-в-Objective-C). – JohnK

ответ

16

Попробуйте использовать NSNumberFormatter.

Это должно позволить вам правильно обрабатывать его на iPhone. Однако убедитесь, что вы используете стиль 10.4+. С этой страницы:

«iPhone OS: режим совместимости с v10.0 недоступен в iPhone OS - доступен только режим 10.4».

+0

Спасибо! Как я мог пропустить этот. :) – Kriem

0

Надежда, что помогает (это в C):

char* intToFormat(int a) 
{ 
    int nb = 0; 
    int i = 1; 
    char* res; 

    res = (char*)malloc(12*sizeof(char)); 
    // Should be enough to get you in the billions. Get it higher if you need 
    // to use bigger numbers. 

    while(a > 0) 
    { 
     if(nb > 3 && nb%3 == 0) 
      res[nb++] = ','; 

     // Get the code for the '0' char and add it the position of the 
     // number to add (ex: '0' + 5 = '5') 
     res[nb] = '0' + a%10; 

     nb++; 
     a /= 10; 
    } 

    reverse(&res); 
    return res; 
} 

Там может быть несколько ошибок я не видел (я слеп, когда дело доходит до этого ...) Это как улучшенный iToA, поэтому, возможно, это не лучшее решение.

2

чистого кода C

// write integer value in ASCII into buf of size bufSize, inserting commas at tousands 
// character string in buf is terminated by 0. 
// return length of character string or bufSize+1 if buf is too small. 
size_t int2str(char *buf, size_t bufSize, int val) 
{ 
    char *p; 
    size_t len, neg; 

    // handle easy case of value 0 first 
    if(val == 0) 
    { 
     a[0] = '0'; 
     a[1] = '\0'; 
     return 1; 
    } 


    // extract sign of value and set val to absolute value 
    if(val < 0) 
    { 
     val = -val; 
     neg = 1; 
    } 
    else 
     neg = 0; 

    // initialize encoding 
    p = buf + bufSize; 
    *--p = '\0'; 
    len = 1; 

    // while the buffer is not yet full 
    while(len < bufSize) 
    { 
     // put front next digit 
     *--p = '0' + val % 10; 
     val /= 10; 
     ++len; 

     // if the value has become 0 we are done 
     if(val == 0) 
      break; 

     // increment length and if it's a multiple of 3 put front a comma 
     if((len % 3) == 0) 
      *--p = ','; 
    } 

    // if buffer is too small return bufSize +1 
    if(len == bufSize && (val > 0 || neg == 1)) 
     return bufSize + 1; 

    // add negative sign if required 
    if(neg == 1) 
    { 
     *--p = '-'; 
     ++len; 
    } 

    // move string to front of buffer if required 
    if(p != buf) 
     while(*buf++ = *p++); 

    // return encoded string length not including \0 
    return len-1; 
} 
+0

Ницца. +1 для хорошего решения C. – Kriem

1

Я сделал это для iPhone игры в последнее время. Я использовал встроенный ЖК-шрифт, который является моноширинным шрифтом. Я отформатировал числа, игнорируя запятые, а затем запятыми вставил запятые. (Как это делают калькуляторы, где запятая не считается символом.)

Посмотрите скриншоты на странице RetroJuJu. Извините - это не полноразмерные скриншоты, поэтому вам придется прищуриться!

3

По крайней мере, на Mac OS X вы можете просто использовать форматировщик строк «» для printf (3).

$ 3 человек Printf

 `''   Decimal conversions (d, u, or i) or the integral portion 
        of a floating point conversion (f or F) should be 
        grouped and separated by thousands using the non-mone- 
        tary separator returned by localeconv(3). 

как в Е ("%" 6d", 1000000);

0

Использование рекурсии, Лука:

#include <stdio.h> 
#include <stdlib.h> 

static int sprint64u(char* buffer, unsigned __int64 x) { 
    unsigned __int64 quot = x/1000; 
    int chars_written; 
    if (quot != 0) { 
    chars_written = sprint64u(buffer, quot); 
    chars_written += sprintf(buffer + chars_written, ".%03u", (unsigned int)(x % 1000)); 
    } 
    else { 
    chars_written = sprintf(buffer, "%u", (unsigned int)(x % 1000)); 
    } 
    return chars_written; 
} 
int main(void) { 
    char buffer[ 32]; 
    sprint64u(buffer, 0x100000000ULL); 
    puts(buffer); 
    return EXIT_SUCCESS; 
} 
30

Вот ответ.

NSNumber* number = [NSNumber numberWithDouble:10000000]; 
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setNumberStyle:kCFNumberFormatterDecimalStyle]; 
    [numberFormatter setGroupingSeparator:@","]; 
    NSString* commaString = [numberFormatter stringForObjectValue:number]; 
    [numberFormatter release]; 
    NSLog(@"%@ -> %@", number, commaString); 
+0

+1: Больше, чем любой другой ответ на эту тему. – FreeAsInBeer

+1

Одно небольшое обновление: было бы лучше использовать NSNumberFormatterDecimalStyle вместо kCFNumberFormatterDecimalStyle (явное перечисление enum на XCode 5 показывает предупреждение) –

Смежные вопросы