Самый простой способ отформатировать число с тысячами разделителей в NSString в соответствии с локалью - PullRequest
26 голосов
/ 18 ноября 2009

Я не могу найти легкий способ сделать это. Точная вещь мне нужна:

[NSString stringWithFormat:@"%d doodads", n];

Где n - это int. Поэтому для 1234 я хотел бы эту строку (под моей локалью):

@"1,234 doodads"

Спасибо.

Ответы [ 5 ]

50 голосов
/ 16 октября 2010

Для 10.6 это работает:

NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
NSString *numberString = [numberFormatter stringFromNumber: [NSNumber numberWithInteger: i]];

И правильно обрабатывает локализацию.

26 голосов
/ 25 ноября 2014

Я недавно обнаружил этот однострочный:

[@1234567 descriptionWithLocale:[NSLocale currentLocale]];  // 1,234,567

Или в Swift 2:

1234567.descriptionWithLocale(NSLocale.currentLocale())     // 1,234,567

Swift 3/4:

(1234567 as NSNumber).description(withLocale: Locale.current)

Отформатировано под вопрос:

[@(n) descriptionWithLocale:[NSLocale currentLocale]];

Отформатировано без литералов Objective-C:

[[NSNumber numberWithInt:n] descriptionWithLocale:[NSLocale currentLocale]];

Это решение, которое я искал, когда задавал вопрос. Доступный начиная с iOS 2.0 и OS X 10.0, документированный, чтобы возвратить строковую версию числа, отформатированного согласно предоставленной локали. stringValue даже задокументировано использование этого метода, но с передачей nil.

Видя, что это мой вопрос, и это лучше всего соответствует моему ответу, я испытываю желание сменить галочку, но это кажется жестоким. Обновление Я поменял галочку, этот ответ .

25 голосов
/ 24 февраля 2012

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

NSNumberFormatter *numberFormat = [[[NSNumberFormatter alloc] init] autorelease];
numberFormat.usesGroupingSeparator = YES;
numberFormat.groupingSeparator = @",";
numberFormat.groupingSize = 3;   
1 голос
/ 07 мая 2014

Тодд Рэнсом ответил на этот вопрос отлично.

Я просто хотел бы добавить (в отдельном комментарии, чтобы я мог показать немного красиво отформатированный код), что если вы планируете делать это регулярно, стоит создать вспомогательный класс NSString.

Итак, создайте себе NSStringHelper.h, содержащий это:

#import <Foundation/Foundation.h>

@interface NSString (NSStringHelper)

+(NSString*)formatWithThousandSeparator:(NSInteger)number;

@end

.. и файл NSStringHelper.m, содержащий это:

#import "NSStringHelper.h"

@implementation NSString (NSStringHelper)

+(NSString*)formatWithThousandSeparator:(NSInteger)number
{
    //  Format a number with thousand seperators, eg: "12,345"
    NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
    NSString *result = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:number]];
    return result;
}

@end

Это дает вам идеальный способ повторно использовать этот код в будущих проектах.

 #import "NSStringHelper.h"

 NSInteger numOfUsers = 12345;
 NSString* strNumberOfUsers = [NSString formatWithThousandSeparator:numOfUsers];

Круто, эй?

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

0 голосов
/ 18 ноября 2009

Используйте NSNumberFormatter.

...