2015-11-13 3 views
5

Я пытаюсь преобразовать строку в NSDecimalNumber здесь мой код:Преобразовать Строка NSDecimalNumber

class func stringToDecimal (dataToDecimal: String) -> NSDecimalNumber { 

    let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString(",", withString: ".") 
    print(dataToDecimal) 
    let decimalReturn = NSDecimalNumber(string: dataToDecimal) 
    print(decimalReturn) 

    if decimalReturn == NSDecimalNumber.notANumber(){ 
     return 0.00 
    } 
    return decimalReturn 
} 

Сначала я подумал, что, может быть, это неправильно, но даже с. он не работает. Первая печать (до преобразования) показывает, например, 80,00, но печать (decimalReturn) показывает только 80

Линия if - это просто, чтобы проверить, не является ли результат не числом.

+0

Вы попробовали 80.01? –

ответ

11

Используйте NSNumberFormatter, чтобы проанализировать ввод данных. Установите свойство generatesDecimalNumbers истина:

let formatter = NumberFormatter() 
formatter.generatesDecimalNumbers = true 

Вот как вы его используете, если вы хотите вернуть 0, когда строка не может быть разобрано:

func decimal(with string: String) -> NSDecimalNumber { 
    return formatter.number(from: string) as? NSDecimalNumber ?? 0 
} 

decimal(with: "80.00") 

// Result: 80 as an NSDecimalNumber 

По умолчанию форматировщик будет смотреть на настройки локали устройства для определения десятичного маркера. Вы должны оставить это таким образом. Ради примера, я заставлю его французской локали:

// DON'T DO THIS. Just an example of behavior in a French locale. 
formatter.locale = Locale(identifier: "fr-FR") 

decimal(with: "80,00") 
// Result: 80 

decimal(with: "80.00") 
// Result: 0 

Если вы действительно хотите, чтобы всегда использовать запятую в качестве десятичного знака, вы можете установить decimalSeparator свойство:

formatter.decimalSeparator = "," 
+0

это сработало, но я должен был выполнить 'let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString (", ", withString:". ")' Во-первых, чтобы моя строка не стала нулевой. Если я просто попробую строку с «,», она принесет нуль в качестве результата. – HongKongTom

+0

Я читал, что NSDecimal является точной для вычисления, но если я возьму 80.01, результат будет 80.01000002, если я возьму 80.10 его 80.09999999. Как бы вы уменьшили цифры до 2? – HongKongTom

+0

Вам нужно будет показать свой код. Лучше было бы сделать это как новый вопрос. –

1

Нет ничего плохого в том, как вы создаете NSDecimalNumber от String. Однако вам может не понадобиться беспокоиться о замене запятой на период, если это так, как ваши локальные форматы.

Причина, по которой он печатает 80 вместо 80,00 или 80,00, состоит в том, что print просто использует свойство description. Если вы хотите настроить форматирование, вы должны настроить свой собственный NSNumberFormatter.

let number = NSDecimalNumber(string: "80.00") 
print(number) // 80 
let formatter = NSNumberFormatter() 
formatter.minimumFractionDigits = 2 
let string = formatter.stringFromNumber(number) 
print(string) // 80.0 
+0

Я пробовал, но в реальном проекте и на игровой площадке появляется сообщение об ошибке «Невозможно преобразовать значение типа« String »в ожидаемый тип аргумента« NSNumber », но ... minimumFractions Мне нравится и будет играть с этим. – HongKongTom

+0

Возможно это это еще одна проблема в вашем коде. Код, который я написал, отлично работает на игровой площадке. –

Смежные вопросы