gpt4 book ai didi

arrays - 将返回类型更改为小数?

转载 作者:行者123 更新时间:2023-11-28 11:07:12 25 4
gpt4 key购买 nike

我正在尝试将我正在处理的当前值转换为百分之一。这是我的代码:

extension String {
var value: Int {
if let found = Array("abc".characters).indexOf(Character(lowercaseString)) {
return found + 1
}
return 0
}
var totalValue: Int {
var result = 0
for letter in self.characters {
result += String(letter).value
}
return result
}
}

所以字母 a = .01,字母 b = .02,字母 c = .03

我该如何修改我的代码才能实现这种情况?

编辑

这是我使用的代码:

@IBAction func sum(sender: AnyObject) {
strValue.text = String(format: "%.2f", "$\(strInput.text!.value.description)")
}

我不知道这是否是正确的方法,但就是这样

最佳答案

字母字符到数值:使用模式匹配

如果您只想允许字母表中的字母进行这种字母 -> 十进制值转换,则可以适本地使用字符 "a" 的 unicode 标量的模式匹配来“z”

另请注意,如果使用包含多个字符的 String 实例调用 StringCharacter 初始化程序,将导致致命的运行时错误 Graphite 烯簇(例如代码示例中的 "ab".value 将产生此类错误)。因此,确定 .value 仅对单字符字符串真正“可用”是合适的;返回值 0,除了包含字母表字符的单字符字符串。

最后,Float 只是一个数字,将始终尽可能准确地显示(受浮点精度限制),但没有多余的小数,这就是为什么精确值的原因。 1/10 显示为 0.1 而不是 0.10。要控制要显示的小数位数,您需要将 float 转换为 String,您可以在其中指定此转换中的格式,例如通过 String(format:) 初始值设定项,或者例如使用 NSNumberFormatter

备选方案 #1:在您自己的示例中使用多个 String 扩展

下面是一个 String 扩展示例,使用模式匹配来提取字母表中(单个)字母的 Float .value 属性,还包括这样一个值的 String 表示,由 .valueAsString 调用(与 totalValue; totalValueAsString 相同)。

/* Alternative #1 */
extension String {

var value: Float {
guard case let uc = lowercaseString.unicodeScalars where uc.count == 1,
let uc1 = uc.first where UnicodeScalar("a")..."z" ~= uc1 else {
return 0
}

return Float(uc1.value-96)/100
}

var valueAsString: String {
return String(format: "%.2f", self.value)
}

var totalValue: Float {
var result: Float = 0
for letter in self.characters {
result += String(letter).value
}
return result
}

var totalValueAsString: String {
return String(format: "%.2f", self.totalValue)
}

}

/* example usage */
"a".valueAsString // 0.01
"b".valueAsString // 0.02
"j".valueAsString // 0.10
"abcn".totalValueAsString // 0.20

备选方案 #2:压缩模式匹配

但是,如果您只对 String 字符的“总值”感兴趣(过滤掉非字母字符),您可以直接将模式匹配作为过滤器应用于完整字符串,无需使用中间 .value 扩展名,例如:

/* Alternative #2 */
extension String {

var totalValueAsString: String {
let pattern = UnicodeScalar("a")..."z"
let filteredSum = self.lowercaseString.unicodeScalars
.filter { pattern ~= $0 }
.reduce(0) { $0 + $1.value - 96 }
return String(format: "%.2f", Float(filteredSum)/100)
}
}

/* example usage */
"abc[n".totalValueAsString // 0.20 (ignoring the non-alphabetic "[" character)

将以上内容应用于您的特定sum(...) 函数

现在,w.r.t.你的编辑

@IBAction func sum(sender: AnyObject) {
strValue.text = String(format: "%.2f", "$\(strInput.text!.value.description)")
}

注意

  • 您应该避免在(假定为)UITextField.text 属性上使用强制展开运算符 (!) strInput,如果这是 `nil.
  • strInput.text 属性是一个 String,而 String(format:) 初始化程序期望一个 Float 作为它的第二个参数。

因此,您在 sum(...) 函数中寻找的内容很可能更符合

@IBAction func sum(sender: AnyObject) {
var decText : String = ""
if let input = strInput.text {
decText = input.totalValueAsString
}
else {
decText = "0.00"
}
strValue.text = "$" + decText
}

鉴于您正在使用上述两个 String 扩展选项之一。


最后,要在 UITextFields 的一般上下文中显示货币,请参见例如以下问答:

关于arrays - 将返回类型更改为小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36873799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com