【问题标题】:How can I get hundredths place instead of tenths place in output如何在输出中获得百分之一而不是十分之一
【发布时间】:2015-12-16 02:21:46
【问题描述】:

当我在文本字段中输入金额时,我会得到十分位的总金额,那么我怎样才能得到百分之一而不是十分位呢? 另外,如何将小费百分比标签设为整数而不是小数?

import UIKit

 class ViewController: UIViewController, SettingsDelegate {
//Inputs
@IBOutlet weak var amountTextField: UITextField!
//Labels
@IBOutlet weak var TipPercentageLabel: UILabel!
@IBOutlet weak var numberOfPersonLabel: UILabel!
@IBOutlet weak var tipAmountLabel: UILabel!
@IBOutlet weak var totalBillLabel: UILabel!
@IBOutlet weak var billPerPersonLabel: UILabel!
//Slider & Stepper
@IBOutlet weak var tipSlider: UISlider!
@IBOutlet weak var personsStepper: UIStepper!
//Variables
var tipPercentage : Double = NSUserDefaults.standardUserDefaults().doubleForKey("DefaultTipRate") ?? 0.20
var numberOfPerson:Int = 1
let numberFormatter:NSNumberFormatter = NSNumberFormatter()




override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    tipAmountLabel.text = "$0.00"
    totalBillLabel.text = "Bill Total"
    billPerPersonLabel.text = "$0.00"
    numberOfPersonLabel.text = "1"
    self.amountTextField.becomeFirstResponder()
    print("DefaultTipRate")
    let tipPercentage : Double = NSUserDefaults.standardUserDefaults().doubleForKey("DefaultTipRate")
    TipPercentageLabel.text = self.numberFormatter.stringFromNumber(tipPercentage)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
func setupContainer() {


    tipSlider.minimumValue = 0
    tipSlider.maximumValue = 100
    tipSlider.value = 20
    tipSlider.addTarget(self, action: "sliderTipChanged:", forControlEvents: .ValueChanged)

    personsStepper.minimumValue = 1
    personsStepper.maximumValue = 30
    personsStepper.value = 1
    personsStepper.addTarget(self, action: "sliderPersonChanged:", forControlEvents: .ValueChanged)

    amountTextField.text = ""

    refreshCalculation()

}
@IBAction func OnEditingFieldBill(sender: AnyObject) {
    refreshCalculation()
}
func refreshCalculation() {
    numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
    if let amount = numberFormatter.numberFromString(amountTextField.text!) as? Double {

        let tipAmount = amount * tipPercentage
        let totalBill = amount + tipAmount
        let billPerPerson = totalBill / Double(numberOfPerson)
        numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
        tipAmountLabel.text = numberFormatter.stringFromNumber(tipAmount)
        totalBillLabel.text = numberFormatter.stringFromNumber(totalBill)
        billPerPersonLabel.text = numberFormatter.stringFromNumber(billPerPerson)

    } else {

        tipAmountLabel.text = "-"
        totalBillLabel.text = "-"
        billPerPersonLabel.text = "-"
    }

    numberFormatter.numberStyle = NSNumberFormatterStyle.PercentStyle
    numberFormatter.minimumFractionDigits = 2
    numberFormatter.maximumFractionDigits = 2
    TipPercentageLabel.text = String(format: "%.0f%%", tipPercentage)

    numberOfPersonLabel.text = "\(numberOfPerson)"

}
@IBAction func sliderTipChanged(sender: AnyObject) {
    tipPercentage = Double(round(tipSlider.value)) / 100
    refreshCalculation()
}
@IBAction func StepperPersonChanged(sender: AnyObject) {
    numberOfPerson = Int(round(personsStepper.value))
    refreshCalculation()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let SettingsViewController = segue.destinationViewController as? SettingsViewController {
        SettingsViewController.delegate = self
        refreshCalculation()
    }
}
func tipPercentageChanged(newValue: Double) {
    TipPercentageLabel.text = "\(newValue)%"
    tipPercentage = newValue
    refreshCalculation()
}

设置查看代码

import UIKit
protocol SettingsDelegate{
func tipPercentageChanged(newValue : Double)
}
class SettingsViewController: UIViewController {
@IBOutlet weak var tipControl: UISegmentedControl!
var tipRates:Double?
var destName : String!
var delegate :SettingsDelegate?

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
@IBAction func changeValue(sender: UISegmentedControl) {
    var tipRate = [0.05, 0.10, 0.15, 0.20, 0.25, 0.30]
    tipRates = (tipRate[tipControl.selectedSegmentIndex])
    delegate?.tipPercentageChanged(tipRates!); print("(tipRates)")
    NSUserDefaults.standardUserDefaults().setDouble(tipRates!, forKey: "DefaultTipRate")
    NSUserDefaults.standardUserDefaults().synchronize()
}

}

【问题讨论】:

    标签: swift calculator currency


    【解决方案1】:

    由于您使用的是NSNumberFormatter,请将maximumFractionDigitsminimumFractionDigits 属性设置为2

    let numberFormatter = NSNumberFormatter()
    numberFormatter.maximumFractionDigits = 2
    numberFormatter.minimumFractionDigits = 2
    
    let str = numberFormatter.stringFromNumber(14.7)  // "14.70"
    

    或者,您可以使用String(format:) 构造函数:

    let str = String(format: "%.2f", 14.7) // "14.70"
    

    对于您的小费百分比,由于您将其存储为小数百分比,您可以这样做:

    let tipPercentage: Double = 0.17
    TipPercentageLabel.text = String(format: "%.0f%%", tipPercentage * 100)  // "17%"
    

    【讨论】:

    • 谢谢,所以我必须创建一个常量 let str?
    • 好的,我将在帖子中更新我的代码,但我运行应用程序并且小费百分比在百分之一,所以我可以制作另一个 NSNumberFormater
    • 我更新了上面的代码,我使用 String(format: "%.0f%%", tipPercentage) 并且当我使用提示滑块时,百分比永远不会改变,它总是 0%
    • 非常感谢它现在可以正常工作了!感谢您的帮助
    • 嘿@vacawama 你能再回答一个问题吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2011-06-16
    相关资源
    最近更新 更多