【问题标题】:ios numberformatter currency remove trailing decimals if 0ios numberformatter currency 如果为 0,则删除尾随小数
【发布时间】:2014-04-13 16:13:17
【问题描述】:

我想将我的号码格式化为货币字符串。有以下几种情况

25.00 => $25
25.43 => $25.43
25.4 => $25.40
0.00 -> $0

NSNumberFormatter 有没有办法做到这一点?

这是我现在的代码:

NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
[fmt setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmt setCurrencyCode:@"USD"];

但是对于我的第一个和最后一个示例来说这都失败了。

我也试过了:

NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
[fmt setPositiveFormat:@"$0.##"];

但是,我的第三个案例失败了。有什么建议吗?

【问题讨论】:

  • 您可以简单地使用标准格式化程序,然后查看结果是否以.00 结尾。如果是这样,请将其剥离。
  • 是的,这是有道理的,我会这样做的。谢谢!
  • 顺便说一句 - 你确定要硬编码货币吗?以及如何处理其他语言环境的十进制格式?根据用户的语言环境,您可能会得到25,00$ 或各种其他格式。请记住这一点。
  • 目前我只与美国打交道

标签: ios currency nsnumberformatter


【解决方案1】:

根据数字是否为整数来更改小数位数。

- (NSString *)stringFromNumber:(NSNumber *)number
{
    BOOL isWholeNumber = (roundf(number.doubleValue) == number.doubleValue);
    self.currencyNumberFormatter.maximumFractionDigits = self.currencyNumberFormatter.minimumFractionDigits = isWholeNumber ? 0 : 2;

    NSString *str = [self.currencyNumberFormatter stringFromNumber:number];
    return str;
}

【讨论】:

    【解决方案2】:

    我认为没有办法使用普通的NSNumberFormatter 来做到这一点。您可以将最小和最大小数位数设置为 0,仅用于格式化 NSNumberFormatter 子类中的整数:

    @interface MyCurrencyFormatter : NSNumberFormatter
    @end
    
    @implementation MyCurrencyFormatter
    
    - (id)init {
        if ((self = [super init])) {
            [self setNumberStyle:NSNumberFormatterCurrencyStyle]];
            [self setCurrencyCode:@"USD"];
        }
        return self;
    }
    
    - (NSString *)stringFromNumber:(NSNumber *)aNumber {
        NSInteger minimumFractionDigits = [self minimumFractionDigits];
        NSInteger maximumFractionDigits = [self maximumFractionDigits];
        if ([self isInteger:aNumber]) {
            [self setMinimumFractionDigits:0];
            [self setMaximumFractionDigits:0];
        }
        NSString *formattedNumber = [super stringFromNumber:aNumber];
        [self setMinimumFractionDigits:minimumFractionDigits];
        [self setMaximumFractionDigits:maximumFractionDigits];
        return formattedNumber;
    }
    
    - (BOOL)isInteger:(NSNumber *)aNumber {
        NSDecimal decimalValue = aNumber.decimalValue;
        NSDecimalRound(&decimalValue, &decimalValue, 0, NSRoundDown);
        NSDecimalNumber *roundedValue = [[NSDecimalNumber alloc] initWithDecimal:decimalValue]
        return [aNumber isEqualToNumber:roundedValue];    
    }
    
    @end
    

    这也应该处理国际号码格式。

    感谢this post 确定数字是否为整数。

    【讨论】:

    • 这不适用于$25 或任何其他零美分的值。
    • 是的 @rmaddy 是正确的,我的第一个案例失败了。
    • 抱歉,误解了您的意图
    • 谢谢奥斯汀,正是我的想法。
    • 请不要将此解决方案用于国际应用程序。某些语言环境使用以下格式 1.000.000,00,您当然不想删除那些 .00
    【解决方案3】:

    我在 Swift 中使用以下解决方案。它基于 jowie 的回答,但如果我的号码不完整,我不想更改 maximumFractionDigits。在某些国家/地区,价格使用超过 2 位数字。

    if(price==price.decimalNumberByRoundingAccordingToBehavior(nil))
    {
      numberFormatter.maximumFractionDigits=0
      numberFormatter.minimumFractionDigits=0
    }
    let priceStr = numberFormatter.stringFromNumber(price)!
    

    【讨论】:

      【解决方案4】:

      实现所需结果但保持灵活的“快速”方法是通过设置要显示的最小和最大小数位数来设置范围:

      let price: NSDecimalNumber // 299.0
      let priceLocale: Locale    // .current
      
      let formatter = NumberFormatter()
      formatter.numberStyle = .currency
      formatter.locale = priceLocale
      formatter.maximumFractionDigits = 2
      formatter.minimumFractionDigits = 0
      
      let result = formatter.string(from: price) ?? "" // 299 $
      

      【讨论】:

        猜你喜欢
        • 2020-07-23
        • 2020-03-31
        • 1970-01-01
        • 2018-09-29
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2021-11-30
        相关资源
        最近更新 更多