【问题标题】:How to add commas to number every 3 digits in Objective C?如何在Objective C中每3位数字添加逗号?
【发布时间】:2011-01-15 02:01:50
【问题描述】:

如果我有一个数字 int aNum = 2000000 我如何格式化它以便可以将其显示为 NSString 2,000,000?

【问题讨论】:

    标签: objective-c nsstring


    【解决方案1】:

    对于那些需要使用数字字符串而不仅仅是整数(即大数字)的人,我制作了以下宏:

    #define addCommas(__string) (\
    (^NSString *(void){\
    NSString *__numberString = __string;\
    NSString *__integerPortion = __numberString;\
    NSString *__decimalPortion = @"";\
    if ([__string containsString:@"."]) {\
    __integerPortion = [__numberString componentsSeparatedByString:@"."][0];\
    __decimalPortion = st(@".%@", [__numberString componentsSeparatedByString:@"."][1]);\
    }\
    int __i = (int)__integerPortion.length-3;\
    while (__i > 0) {\
    __integerPortion = st(@"%@,%@", substringInRange(__integerPortion, 0, __i), substringInRange(__integerPortion, __i, (int)__integerPortion.length));\
    __i -= 3;\
    }\
    __numberString = st(@"%@%@", __integerPortion, __decimalPortion);\
    return __numberString;\
    })()\
    )
    

    【讨论】:

      【解决方案2】:

      对于 Swift 4.0

      let formatter = NumberFormatter()
      
      formatter.numberStyle = .decimal
      
      formatter.minimumFractionDigits = 2
      
      formatter.maximumFractionDigits = 2
      
      let result = formatter.string(from: NSNumber(value: 123456))
      

      【讨论】:

        【解决方案3】:

        一个简单的解决方案可能是这样。我的答案与@Nazir 的答案几乎相同,但有一个小技巧。

        double current_balance = 2000000.00;
        
        NSNumberFormatter * formatter = [NSNumberFormatter new];
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
        //[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];  //if you want for currency with $ sign
        [formatter setMinimumFractionDigits:2]; // Set this if you need 2 digits
        [formatter setMaximumFractionDigits:2]; // Set this if you need 2 digits
        NSString * currency_format =  [NSString stringWithFormat:@"%@", [formatter stringFromNumber:[NSNumber numberWithDouble:current_balance]]];
        

        【讨论】:

          【解决方案4】:

          想一想,因为我会在这篇文章中寻找样本。 因此,如果您正在使用数字,请注意下一个参数:

          setNumberStyle:NSNumberFormatterCurrencyStyle // if you are working with currency
          

          也可以

          setNumberStyle:NSNumberFormatterDecimalStyle
          

          所有代码都适用于 ARC。

          如果您正在使用 Integer 并需要获得 200,000 等结果

          int value = 200000;
          NSNumberFormatter * formatter = [NSNumberFormatter new];
          [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
          NSString * newString =  [formatter stringFromNumber:[NSNumber numberWithInteger:value]];
          

          如果您正在使用 Float 并且需要获得诸如 200,000.00 之类的结果

          float value = 200000;
          NSNumberFormatter * formatter = [NSNumberFormatter new];
          [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
          [formatter setMaximumFractionDigits:2]; // Set this if you need 2 digits
          NSString * newString =  [formatter stringFromNumber:[NSNumber numberWithFloat:value]];
          

          编辑

          要能够使用不同的数字分隔符,请使用NSLocale。 添加到在语言环境标识符上指定 NSLocale 的代码:

          [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]];
          

          或使用当前本地:

          [formatter setLocale:[NSLocale currentLocale]];
          

          【讨论】:

          • 如果我想要点(.) 而不是逗号(,) 那么?
          • 我们使用NSLocale 的简单方法只需添加[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]]; 以使用不同的分隔符,取决于本地数字样式
          • 如何显示 5,234.00... 我需要显示 2 个十进制数字
          • @Singapore 使用setMaximumFractionDigits 设置您需要的数字位数
          【解决方案5】:

          斯威夫特版本

          let formatter = NSNumberFormatter()
          formatter.numberStyle = .DecimalStyle
          formatter.maximumFractionDigits = decimalPlaces
          let result = formatter.stringFromNumber(NSNumber(double: 8.0))
          

          http://ios.eezytutorials.com

          【讨论】:

            【解决方案6】:

            更简单:

            NSNumber *someNumber = @(1234567890);
            NSString *modelNumberString = [NSString localizedStringWithFormat:@"%@", someNumber];
            NSLog(@"Number with commas: %@", modelNumberString);
            

            同事今天刚刚教我这个。 #惊人的

            【讨论】:

            • localizedStringWithFormat 取决于您当前的语言环境,并且对于不同的语言会产生不同的分隔符。
            【解决方案7】:

            使用NSNumberFormatter

            具体来说:

            NSNumberFormatter *formatter = [NSNumberFormatter new];
            [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; // this line is important!
            
            NSString *formatted = [formatter stringFromNumber:[NSNumber numberWithInteger:2000000]];
            
            [formatter release];
            

            默认情况下NSNumberFormatter 使用当前语言环境,因此默认情况下分组分隔符设置为正确的值。关键是要记住设置数字样式。

            【讨论】:

            • 是的,我有类似的问题,它不会解析“200,000”,即使我将语言环境设置为英国英语,直到我将样式设置为 NSNumberFormatterDecimalStyle。认为它只会理解字符串“200000”
            • @MCKapur 你为什么说新就是老派?输入更多来做同样的事情是没有意义的,不是吗?
            • @JulioBailon WOW 这就像 2 年前一样。老实说,不记得为什么我说 +new 是老派。它不是。然而,我更喜欢 +alloc-init 以保持一致性,+new 总感觉像是一个不必要的捷径,而 +alloc-init 帮助我保持良好的代码实践。
            • 如果我想要逗号和小数位怎么办?
            【解决方案8】:

            不要自己进行数字格式化。您几乎肯定不会正确处理所有边缘情况或正确处理所有可能的语言环境。使用NSNumberFormatter 将数字数据格式化为本地化的字符串表示形式。

            您可以使用NSNumberFormatter 实例方法-setGroupingSeparator: 将分组分隔符设置为@","(或者更好的是[[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator];感谢@ntesler)和-setGroupingSize:,以便每3 位数放置一个分组分隔符。

            【讨论】:

            • 酷,在我 -setGroupingSize: 之后我都设置了吗?还是我需要 -setFormat: ?
            • 最好使用[formatter setGroupingSeparator: [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]];进行本地化
            • NSNumberformatter 不够好,特别是如果您需要为国际格式做好准备。
            • NSNumberFormatter 不能很好地处理 NSDecimalNumber。它失去了精度。
            • 如果我想要 dot(.) 而不是 comma(,) 有什么合适的解决方案?
            【解决方案9】:

            static method on NSNumberFormatter 可以满足您的需求:

            int aNum = 2000000;
            NSString *display = [NSNumberFormatter localizedStringFromNumber:@(aNum)
                                                                 numberStyle:NSNumberFormatterDecimalStyle];
            

            如果您不需要对格式化程序进行任何额外配置,这种方式比创建新的NSNumberFormatter 更简洁一些。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-31
              • 1970-01-01
              • 1970-01-01
              • 2019-04-11
              • 1970-01-01
              • 2015-05-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多