如何显示结果十进制样式而不是指数



我试图将一个值转换为另一个值(从埃到arshin,俄罗斯古代的长度值(,但经常得到指数样式1.837684e-10的结果。我需要以十进制样式显示它 0.0000000001837.

我使用的代码:

let formatter = NumberFormatter()
formatter.locale = Locale.current
formatter.numberStyle = NumberFormatter.Style.decimal
if let text = textField.text, let number = formatter.number(from: text) {
     angstrem = number.doubleValue
     arshin = Double(angstrem * 7112000000.0000)
     arshinLabel.text = "(arshin)"
}

添加此行没有任何结果:

formatter.numberStyle = NumberFormatter.Style.decimal

UPD那里有完整的代码:

导入 UIKit

class AngstremViewController: UIViewController {

var angstrem: Double = 0
var arshin: Double = 0
var versta: Double = 0
var vershok: Double = 0
var decimetr: Double = 0
var duim: Double = 0
var kilometr: Double = 0
var metr: Double = 0
var mili: Double = 0
var millimetr: Double = 0
var mormil: Double = 0
var sajen: Double = 0
var santimetr: Double = 0
var fut: Double = 0
var yard: Double = 0

@IBOutlet weak var textField: UITextField!


//Result labels
@IBOutlet weak var angstremLabel: UILabel!
@IBOutlet weak var arshinLabel: UILabel!
@IBOutlet weak var verstaLabel: UILabel!
@IBOutlet weak var vershokLabel: UILabel!
@IBOutlet weak var decimetrLabel: UILabel!
@IBOutlet weak var duimLabel: UILabel!
@IBOutlet weak var kilometrLabel: UILabel!
@IBOutlet weak var metrLabel: UILabel!
@IBOutlet weak var miliLabel: UILabel!
@IBOutlet weak var millimetrLabel: UILabel!
@IBOutlet weak var mormiliLabel: UILabel!
@IBOutlet weak var sajenLabel: UILabel!
@IBOutlet weak var santimetrLabel: UILabel!
@IBOutlet weak var futLabel: UILabel!
@IBOutlet weak var yardLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    let toolBar = UIToolbar()
    toolBar.sizeToFit()
    toolBar.tintColor = UIColor.init(red:47/255.0, green:158/255.0, blue:249/255.0, alpha: 1.0)
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
    let doneButon = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.doneClicked))

    toolBar.setItems([flexibleSpace, doneButon], animated: true)
    textField.inputAccessoryView = toolBar
}

@objc func doneClicked() {
    view.endEditing(true)
    let formatter = NumberFormatter()
    formatter.locale = Locale.current
    formatter.numberStyle = NumberFormatter.Style.decimal
    if let text = textField.text, let number = formatter.number(from: text) {
        angstrem = number.doubleValue
        arshin = Double(angstrem * 0.00000000014060742)
        versta = Double(angstrem * 0.00000000000009373828270000001)
        vershok = Double(angstrem * 0.0000000022497188)
        decimetr = Double(angstrem * 0.000000001)
        duim = Double(angstrem * 0.0000000039370078700000005)
        kilometr = Double(angstrem * 0.0000000000001)
        metr = Double(angstrem * 0.0000000001)
        mili = Double(angstrem * 0.000000000000062137119)
        millimetr = Double(angstrem * 0.0000001)
        mormil = Double(angstrem * 0.00000000000005399568)
        sajen = Double(angstrem * 0.000000000046869141)
        santimetr = Double(angstrem * 0.00000001)
        fut = Double(angstrem * 0.00000000032808399)
        yard = Double(angstrem * 0.00000000010936132999999999)
        arshinLabel.text = "(arshin)"
        verstaLabel.text = "(versta)"
        vershokLabel.text = "(vershok)"
        decimetrLabel.text = "(decimetr)"
        duimLabel.text  = "(duim)"
        kilometrLabel.text = "(kilometr)"
        metrLabel.text = "(metr)"
        miliLabel.text = "(mili)"
        millimetrLabel.text = "(millimetr)"
        mormiliLabel.text = "(mormil)"
        sajenLabel.text = "(sajen)"
        santimetrLabel.text = "(santimetr)"
        futLabel.text = "(fut)"
        yardLabel.text = "(yard)"
    }
}

}

如果我转换这个

let number = formatter.number(from: text)

let number = formatter.String(from: number)

我有错误。我了解方法,但在所有情况下它都不起作用。

有人可以帮忙吗?

所以首先你所做的根本没有使用格式化程序(正如 @Martin R 已经提到的(。您需要使用 formatter.string(from: <#number#>) .但它也不会以这种方式工作,它很可能会显示"0"。要模拟结果,您需要使用.scientific样式。

因此,您正在寻找的是.decimal样式,其中包括minimumFractionDigits,这将强制显示您需要的数字。另一种可能更好的方法是使用 minimumSignificantDigits .这将始终显示至少 N 个非零数字(有点,1001仍然算作 4 个非零(。

另一个问题是,在处理此类值时,您根本不应该使用double。您需要NSDecimalNumber专为精度和大值而设计。

检查以下示例,该示例结合了所有这些内容:

let firstValue = NSDecimalNumber(string: "0.0000000001837")
let secondValue: NSDecimalNumber = 0.00001
let overallValue = firstValue.multiplying(by: secondValue)
let formatter = NumberFormatter()
formatter.locale = .current
formatter.numberStyle = .decimal
formatter.minimumSignificantDigits = 4
if let text = formatter.string(from: overallValue) {
    print(text)
}

这将打印0,000000000000001837的结果。如果我将minimumSignificantDigits增加到6,那么结果将是0,00000000000000183700.

我已经在操场上转换了你的代码,你会发现它很有用:

let formatter = NumberFormatter()
formatter.locale = Locale.current
formatter.numberStyle = NumberFormatter.Style.decimal
let text = "0.0000000001837"
//! Convert string to number
let number = formatter.number(from: text)!
// 1.837e-10
let stringFromNumber = formatter.string(from: number)
//0
// Set up maximum number of fractional digits in formatter
formatter.maximumFractionDigits = 100
let fullStringFromNumber = formatter.string(from: number)
//"0.0000000001837"
let angstrem = number.doubleValue
let arshin = Double(angstrem * 7112000000.0000)
//1.3064744
let arshinNumber = NSNumber(value: arshin)
let arshinStr = formatter.string(from: arshinNumber)
//"1.3064744"

感谢@matic-oblak !

解决方案是:

let formatter = NumberFormatter()
        formatter.locale = Locale.current
        formatter.numberStyle = .decimal
        formatter.minimumSignificantDigits = 6

        if let text = textField.text, let number = formatter.number(from: text) {

            angstrem = number.doubleValue

            arshinLabel.text = formatter.string(from: NSDecimalNumber(value: angstrem).multiplying(by: 0.00000000014060742))
}