2015-04-01 4 views
5

Я пишу приложение в swift и воспользовался приведенным ниже кодом. Таким образом, мой результат округляется до двух знаков после запятой, как и ожидалось.Как показать 2 десятичных знака независимо от числа цифр после десятичного в быстром?

Это хорошо работает. Однако, если результат меньше 2 десятичных знаков, он показывает только 1 цифру. Это самый базовый пример, но у меня есть результаты, которые могут быть целым числом или 10 десятичными знаками. Я хочу, чтобы все, чтобы показать, как .xx

1.2345 => 1.23 

1.1 => 1.1 

Как получить результаты, чтобы всегда отображать два знака после запятой, независимо от количества цифр после запятой?

например:1.1 => 1.10

Я искал обширно, но ответ ускользает от меня. Это код, который я пытался до сих пор:

@IBOutlet var odds: UITextField! 
@IBOutlet var oddsLabel: UILabel! 
var enteredOdds = NSString(string: odds.text).doubleValue 
var numberOfPlaces = 2.0 
var multiplier = pow(10.0, numberOfPlaces) 
var enteredOddsRounded = round(enteredOdds * multiplier)/multiplier   
oddsLabel.text = "\(enteredOddsRounded)" 
println("\(enteredOddsRounded)") 

Спасибо за комментарии. Я в следующей редакции:

@IBOutlet var odds: UITextField! 
@IBOutlet var oddsLabel: UILabel! 
var enteredOdds = NSString(string: odds.text).doubleValue 

let formatter = NSNumberFormatter() 
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle 

for identifier in ["en_UK", "eu_US"] { 
    formatter.locale = NSLocale(localeIdentifier: identifier) 
    formatter.minimumFractionDigits = 2 
    formatter.maximumFractionDigits = 2 
} 

oddsLabel.text = formatter.stringFromNumber(enteredOdds) 

Это позволило мне потерять много кода, как это делает округления и десятичных разрядов для меня в то же время включая валюту в качестве бонуса.

Thile это работало во всех областях, где мне действительно нужна была валюта для отображения. Вышеуказанное значение «oddsLabel.text» на самом деле не является валютой и поэтому разрешает округление и десятичные знаки.

Как изменить приведенное выше, чтобы он мог учитывать поля с и/или без валюты. Надеюсь, не повторив код снова?

Еще раз спасибо за все быстрые ответы.

Frank

+0

Создайте ne w formatter для каждого поля. Вам не нужно копировать, просто создавать функции для общих вещей. – Sulthan

ответ

1

Может быть, вы ищете NSNumberFormatter:

let nf = NSNumberFormatter() 
nf.minimumFractionDigits = 2 
nf.stringFromNumber(enteredOddsRounded) 
10
let b = 2.1 
println(String(format:"%.02f", b)) 

дает строку "2.10" в моей детской площадке.

9

То, что вы использовали, называется «наивной» реализацией. Он работает в основном, но он имеет некоторые незначительные проблемы и некоторые скрытые проблемы. Одной из скрытых проблем является то, что вы полностью игнорируете пользовательский язык - большинство европейских языков используют запятую как разделитель десятичной дроби, а не точку.

Чтобы решить проблему десятичного числа до преобразования строк (и наоборот), большинство языков программирования предоставляют выделенный API. В Cocoa/CocoaTouch есть NSNumberFormatter.

Пример:

let formatter = NumberFormatter() 
formatter.numberStyle = .decimal 
formatter.minimumFractionDigits = 2 
formatter.maximumFractionDigits = 2 
oddsLabel.text = formatter.stringFromNumber(enteredOdds) 

Примечание округление делается для вас.

+0

Спасибо Sulthan, я внедрил версию этого, но включая локаль для валюты, используя ссылку от Джона ниже. –

+0

Удивительное решение –

0
oddsLabel.text = (NSString(format:"%.2f", enteredOddsRounded)) 

Это то, что я использую в некоторых случаях

есть также возможность использовать NSNumberFormatter, где вы можете добавить запятые, а

здесь учебник http://nshipster.com/nsformatter/

+0

Спасибо, John, я использовал ссылку, чтобы найти решение части, подобное Sulthans. Хотя теперь мне нужно выяснить, как узнать, должен ли выпуск быть валютой или сейчас. –

1

Расширение минимальные цифры разряда:

extension String { 
     func setMinTailingDigits() -> String { 
      let formatter = NumberFormatter() 
      formatter.minimumFractionDigits = 2 
      return formatter.string(from: Double(self)! as NSNumber)! 
     } 
    } 
Смежные вопросы