这是强制性的“我是编程的新手”但是,我已经搜索了所有可用的答案并得出结论,我的问题可能与代码相关的逻辑更多,但我可能是错的关于那个。我正在构建一个计算器应用程序,除显示中的numberFormatter
(显示逗号分隔符)外,一切正常。每当我尝试格式化显示中的数字时,我都无法显示小数点和逗号。
如果我以十进制.1234开头,我得到0.1234,如果我输入12345,我得到12,345,但如果我输入12345.678,我得到12,345。我正在丢失小数。我已经测试了它和我的功能,以删除无关的“。”似乎不是问题。如果我在标签格式化控件之外运行字符串扩展名numberFormatter
它似乎工作,但我需要防止多个小数和无关的“0”。
我正在向IBAction展示代码,其中包含显示标签display.text
上显示的按钮。在此之后的所有计算都正常工作,replacingOccurrences(of: ",", with: "")
创建一个干净的字符串以转换为Double并进行计算。
我正在使用sting扩展来进行格式化。几个星期以来,我一直在努力。有任何想法吗?我是否必须重构我如何在label.text
中输入文字?
这是向UILabel display
添加文字的代码。
@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 ""
}
答案 0 :(得分:0)
我找到了解决问题的黑客。它不漂亮,但它的工作原理。我能够让numberFormatter更新并显示小数点后的数字,但这导致了一个新问题。如果您键入12345.00,您将获得12,344,并且在您按下另一个数字之前看不到尾随的0。 ex 12345.1 - > 12,345.1,12345.001 - > 12,345.001,但12345.00 - > 12345。
我需要它动态工作,以便用户知道输入了多少个零。我的黑客是将最终数量分成两个数组。一个预格式化和一个后格式化。然后将两者连接在一起作为最终显示号码。
如果有人有任何想法,我仍然希望找到更有效的解决方案。
这是更新的代码。
@IBAction func btnTouchDigit(_ sender:UIButton){ let digit = 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
}
}