这是强制性的“我是编程新手”,但是,我搜索了所有可用的答案并得出结论,我的问题可能比代码更与逻辑相关,但我可能是错的也有关于这个的。我正在构建一个计算器应用程序,除了显示屏中的 numberFormatter
(用于显示逗号分隔符)之外,一切正常。每当我尝试格式化显示屏中的数字时,我都无法让显示屏显示小数点和逗号。
如果我以小数 0.1234 开头,我会得到 0.1234,如果我输入 12345,我会得到 12,345,但如果我输入 12345.678,我会得到 12,345。我正在失去小数点。我已经测试了它和我的功能来删除无关的“。”似乎不是问题。如果我在标签格式化控件之外运行字符串扩展 numberFormatter
,它似乎可以工作,但我需要防止多个小数和无关的“0”。
我向 IBAction 展示了覆盖显示标签上显示的按钮的代码,display.text
这就是问题所在。此后的所有计算都工作正常,使用 replacingOccurrences(of: ",", with: "")
创建一个干净的字符串以转换为 Double 并计算。
我正在使用 sting 扩展来进行格式化。我已经断断续续地为此工作了好几个星期。有任何想法吗?我是否必须重构在 label.text
中输入文本的方式?
这里是将文本添加到 UILabel 显示
的代码。
@IBAction func btnTouchDigit(_ sender: UIButton) {
let digit = sender.currentTitle!
if isUserTyping {
var formattedNumber = ""
print( "is user typting + String\(isUserTyping)")
// make sure we aren't adding a second period
var textCurrentlyInDisplay = display.text
textCurrentlyInDisplay = textCurrentlyInDisplay?.replacingOccurrences(of: ",", with: "")
if digit == "." && ((textCurrentlyInDisplay?.range(of: ".")) != nil) {
return
}
else {
formattedNumber = (textCurrentlyInDisplay! + digit)
print("formattedNumber = \(formattedNumber.twoFractionDigits)")
display.text = formattedNumber.twoFractionDigits
// put code here to format label.text to show thousand seperators
print("textCurrentlyInDisplay end = \(textCurrentlyInDisplay!)")
}
}
// make sure we aren't entering a bunch of zero's
else { print("else + \(isUserTyping)")
display.text = digit
if digit == "0" {return}
else if digit == "." {display.text = "0."}
// display.text = (digit == "." ? "0" : "") + digit
isUserTyping = true
}
}
这是我的扩展,用于处理 numberFormatter
的字符串转换。
extension String {
var twoFractionDigits: String {
let styler = NumberFormatter()
styler.minimumFractionDigits = 0
styler.maximumFractionDigits = 16
styler.numberStyle = .decimal
let converter = NumberFormatter()
converter.decimalSeparator = "."
if let result = converter.number(from: self) {
return styler.string(from: result)!
}
return ""
}
最佳答案
我找到了一个解决我的问题的方法。它不漂亮,但很有效。我能够让 numberFormatter 更新并显示小数点后的数字,但这导致了一个新问题。如果您输入 12345.00,您将得到 12,344,并且在您按下另一个数字之前看不到尾随的 0。例如 12345.1 -> 12,345.1、12345.001 -> 12,345.001,但 12345.00 -> 12,345。
我需要它动态工作,以便用户知道输入了多少个零。我的技巧是将最终金额分成两个数组。一种是预格式化的,另一种是后格式化的。然后将两者连接在一起以获得最终的显示编号。
如果有人有任何想法,我仍然希望找到更有效的解决方案。
这是更新后的代码。
@IBAction func btnTouchDigit(_ 发送者: UIButton) { 让数字 = sender.currentTitle!
if isUserTyping {
preFormattedNumber = (display.text?.replacingOccurrences(of: ",", with: ""))!
// set the limit for number of digits user can enter at once
if display.text!.count >= 16 {
return
}
else {
// make sure we aren't adding a second period
if digit == "." && ((preFormattedNumber.range(of: ".")) != nil) {
print("extra decimal pressed")
return
}
else {
preFormattedNumber = (preFormattedNumber + digit)
print("preFormattedNumber before Formatting = \(preFormattedNumber)")
}
// put code here to format label.text to show thousand seperators
if ((preFormattedNumber.range(of: ".")) != nil){
print("just checked for .")
let numPreFormat = preFormattedNumber
let numAfterFormat = preFormattedNumber.twoFractionDigits
let numArray = numPreFormat.components(separatedBy: ".")
let numArrayFormatted = numAfterFormat.components(separatedBy: ".")
let afterDecimal = numArray.last
let beforeDecimal = numArrayFormatted.first
let finalNumberToDisplay = beforeDecimal! + "." + afterDecimal!
print("numArray = \(numArray)")
print("final number to display = \(finalNumberToDisplay)")
print("numArray = \(numArray)")
display.text = finalNumberToDisplay
runningNumber = display.text!
}
else {
display.text = preFormattedNumber.twoFractionDigits
runningNumber = display.text!
}
}
}
// make sure we aren't entering a bunch of zero's
else { print("else + \(isUserTyping)")
preFormattedNumber = digit
display.text = preFormattedNumber
runningNumber = display.text!
if digit == "0" {return}
else if digit == "." { preFormattedNumber = "0.";
}
display.text = preFormattedNumber
runningNumber = display.text!
isUserTyping = true
}
}
关于ios - 数字格式化程序不允许显示小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45891741/