如何显示结果小数样式而不是指数?
How to show result decimal style not exponential?
我尝试将一个值转换为另一个值(从埃到 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
样式。
所以您正在寻找的是包含 minimumFractionDigits
的 .decimal
样式,它会强制显示您需要的数字。另一个可能更好的方法是使用 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
.
我已经在 playground 中转换了你的代码,你会发现它很有用:
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))
}
我尝试将一个值转换为另一个值(从埃到 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
样式。
所以您正在寻找的是包含 minimumFractionDigits
的 .decimal
样式,它会强制显示您需要的数字。另一个可能更好的方法是使用 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
.
我已经在 playground 中转换了你的代码,你会发现它很有用:
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))
}