Подтвердить что ты не робот

Самый простой способ форматировать число с тысячами разделителей на NSString в соответствии с локали

Я не могу найти простой способ сделать это. То, что мне нужно, это:

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

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

@"1,234 doodads"

Спасибо.

4b9b3361

Ответ 1

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

[@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.

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

Ответ 2

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

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

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

Ответ 3

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

NSNumberFormatter *numberFormat = [[[NSNumberFormatter alloc] init] autorelease];
numberFormat.usesGroupingSeparator = YES;
numberFormat.groupingSeparator = @",";
numberFormat.groupingSize = 3;   

Ответ 4

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

Я просто хотел бы добавить (в отдельном комментарии, чтобы я мог показать какой-то красиво отформатированный код), что, если вы планируете делать это регулярно, стоит создать вспомогательный класс 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.