разбор строки в различный вид числовой строки - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть строка с именем realEstateWorth стоимостью 12 000 000 долларов.Мне нужно, чтобы эта строка оставалась строкой, но любое число (например, указанное выше) должно отображаться как $ 12 МИЛЛИОНОВ или $ 6 МИЛЛИОНОВ.Суть в том, что после числа нужно слово «МИЛЛИОН».

Я знаю, что есть nsNumberFormatter, который может преобразовывать строки в числа и наоборот, но может ли он делать то, что мне нужно?

Если у кого-то есть какие-либо идеи или предложения, мы будем очень признательны.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 06 декабря 2011

Итак, на мой взгляд, у вас есть две проблемы:

  1. У вас есть строковое представление чего-то, что на самом деле является числом
  2. У вас (потенциально) есть нужное вам числоотформатированный как строка

Итак, задача № 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 голос
/ 06 декабря 2011

Я бы рекомендовал хранить это значение как NSNumber или как число с плавающей точкой. Тогда у вас мог бы быть метод для генерации строки 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 этого процесса.

1 голос
/ 06 декабря 2011

В худшем случае вы могли бы реализовать category на NSString для реализации желаемого поведения.
В методе, который вы будете использовать в этом category, вы можете взять NSNumberFormatter, чтобы привести эту строку к числу, и, выполнив некоторую операцию по модулю, вы можете определить, нужно ли вам слово Million, или Billion, и т. Д. И вернуть строку с модулем для Million или другим способом, который вам нужен.

Таким образом, вы можете просто вызвать этот метод на вашей NSString так:

NSString *humanReadable = [realEstateWorth myCustomMethodFromMyCategory];

А также. NSString are immutable, поэтому вы не можете изменить его, если не назначите новый переменной.

...