将字符串解析为不同类型的数字字符串

时间:2011-12-06 18:14:19

标签: objective-c ios xcode nsnumberformatter

我有一个名为realEstateWorth的字符串,其值为$ 12,000,000。 我需要这个相同的字符串来保持字符串,但任何数字(例如上面的那个)都要显示为1200万美元或600万美元。关键是它需要在数字之后加上“MILLION”字样。

我知道有nsNumberFormatter可以将字符串转换为数字,反之亦然,但它可以做我需要的吗?

如果有任何想法或建议,我们将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:5)

所以我看到它,你有两个问题:

  1. 您的字符串表示实际上是一个数字
  2. 您(可能)有一个要格式化为字符串的数字
  3. 所以,问题#1:

    要将字符串转换为数字,请使用NSNumberFormatter。你有一个非常简单的案例:

    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSNumber *n = [f numberFromString:@"$12,000,000"];
    // n is 12000000
    

    这很简单!现在问题#2:

    这比较棘手,因为你想要一种混合的拼写风格。您可以考虑再次使用NSNumberFormatter,但这不太正确:

    [f setNumberStyle:NSNumberFormatterSpellOutStyle];
    NSString *s = [f stringFromNumber:n];
    // s is "twelve million"
    

    所以,我们离得更近了。在这一点上,你或许可以做类似的事情:

    NSInteger numberOfMillions = [n integerValue] / 1000000;
    if (numberOfMillions > 0) {
      NSNumber *millions = [NSNumber numberWithInteger:numberOfMillions];
      NSString *numberOfMillionsString = [f stringFromNumber:millions]; // "twelve"
    
      [f setNumberStyle:NSNumberFormatterCurrencyStyle];
      NSString *formattedMillions = [f stringFromNumber:millions]; // "$12.00"
    
      if ([s hasPrefix:numberOfMillionsString]) {
        // replace "twelve" with "$12.00"
        s = [s stringByReplacingCharactersInRange:NSMakeRange(0, [numberOfMillionsString length]) withString:formattedMillions];
    
        // if this all works, s should be "$12.00 million"
        // you can use the -setMaximumFractionDigits: method on NSNumberFormatter to fiddle with the ".00" bit
      }
    }
    

    然而

    我不知道除英语之外的其他方面有多好。 CAVEAT IMPLEMENTOR

答案 1 :(得分:1)

最糟糕的情况是,您可以在category上实施NSString来实施您想要的行为。
在你将category中执行的方法中,你可以使用NSNumberFormatter将该字符串带入一个数字,并通过做一些模运算,你可以定义你是否需要单词Million,或Billion等,然后放回去一个字符串,其中包含Million的模数或您需要的其他方式。

这样你就可以在你的NSString上调用这个方法,如下所示:

NSString *humanReadable = [realEstateWorth myCustomMethodFromMyCategory];

还有。 NSString are immutable,因此除非您为变量指定一个新变种,否则无法更改它。

答案 2 :(得分:1)

我建议将此值存储为NSNumber或float。然后你可以有一个生成NSString的方法来显示它:

- (NSString*)numberToCurrencyString:(float)num
{
   NSString *postfix = @"";
   if (num > 1000000000)
   {
      num = num / 1000000000;
      postfix = @" Billion";
   }
   else if (num > 1000000)
   {
      num = num / 1000000;
      postfix = @" Million";
   }

   NSString *currencyString = [NSString stringWithFormat:@"%.0f%@", num, postfix];
   return currencyString;
}

注意:您的问题表明您的输入需要保留为字符串。没关系。因此,您需要1.)首先解析字符串中的数字,然后2.)然后将其重新转换为数字中的字符串。我已经展示了如何完成这个过程的第2步。