2016-06-21 3 views
-1

Как форматировать десятичные значения со следующими правиламиКак укоротить фракции с помощью NSNumberFormatter

0.12345 => 0.12 
10.12345 => 10.12 
100.12345 => 100.1 
1000.12345 => 1,000 

Пожалуйста, обратите внимание, что идея состоит в том, чтобы взять то же самое место. C style printf позволяет сделать это, используя что-то 4.2%f плюс как-то разделитель тысяч, но я не понимаю, как отразить его в какао.

UPDATE

Если вы не заметили, например, говорит, что 0.12345 превращается в 0.12 не к 0.1234.

ответ

1

С NSNumberFormatter игнорирует maximumFractionDigits, когда включен значительный режим. Я создал собственный класс

class TRNumberFormatter: NSNumberFormatter { 

    override func stringFromNumber(number: NSNumber) -> String? { 
     let digitsCount = "\(number.integerValue)".characters.count 
     let value = self.Tround(number.doubleValue, precision: min(self.maximumIntegerDigits - digitsCount, self.maximumFractionDigits)) 
     return super.stringFromNumber(value) 
    } 

    func Tround(value: Double, precision: Int) -> Double { 
     let divisor = pow(10.0, Double(precision)) 
     return round(value * divisor)/divisor 
    }  
} 

Чтобы использовать его только

var numberFormatter: NSNumberFormatter = TRNumberFormatter() 
numberFormatter.usesGroupingSeparator = true 
numberFormatter.maximumIntegerDigits = 4 
numberFormatter.minimumIntegerDigits = 1 
numberFormatter.maximumFractionDigits = 2 

Результаты

print(numberFormatter.stringFromNumber(0.12345)) // Optional("0.12") 
print(numberFormatter.stringFromNumber(10.12345)) // Optional("10.12") 
print(numberFormatter.stringFromNumber(100.12345)) // Optional("100.1") 
print(numberFormatter.stringFromNumber(1000.12345)) // Optional("1,000") 
0

это сближается:

#import <Foundation/Foundation.h> 

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
     NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; 
     nf.usesSignificantDigits = YES; 
     nf.maximumSignificantDigits = 4; 
     nf.usesGroupingSeparator = YES; 
     NSLog(@"%@", [nf stringFromNumber:@(10.23455)]); 
    } 
} 

НО пренебрегает максимум 2 знаков после запятой ОП хочет и установка maximumFractionDigits=2 не работает

мне кажется, мы не можем подражать этому 4.2 % f точно ... без подклассификации всего объекта

+0

Проблема здесь, если я ставлю 0.123456 возвращает 0.1234 вместо 0,12 – Moldaone

+0

@Moldaone Да из-за 'nf.maximumSignificantDigits = 4 возможно,? – Droppy

+0

@Droppy Пожалуйста, прочитайте вопрос – Moldaone