Arrays 将返回类型更改为十进制?

Arrays 将返回类型更改为十进制?,arrays,swift,swift-extensions,Arrays,Swift,Swift Extensions,我试图将当前处理的值转换为百分之一百。这是我的密码: extension String { var value: Int { if let found = Array("abc".characters).indexOf(Character(lowercaseString)) { return found + 1 } return 0 } var totalValue: Int { va

我试图将当前处理的值转换为百分之一百。这是我的密码:

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=0.01,字母b=0.02,字母c=0.03

我将如何修改我的代码以实现这一点

编辑

这是我正在使用的代码:

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

我不知道这是否是正确的方法,但它是将
值的返回值除以100

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

"a".value // 0.01
"b".value // 0.02
"c".value // 0.03
"abc".totalValue // 0.06
要用三位小数显示每个值,请使用格式字符串:

String(format: "%.3f", "a".value) // "0.010"
或小数点后两位:

String(format: "%.2f", 0.1) // 0.10

值的返回值除以100

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

"a".value // 0.01
"b".value // 0.02
"c".value // 0.03
"abc".totalValue // 0.06
要用三位小数显示每个值,请使用格式字符串:

String(format: "%.3f", "a".value) // "0.010"
或小数点后两位:

String(format: "%.2f", 0.1) // 0.10
字母字符到数字值:使用模式匹配 如果希望仅对字母表中的字母允许这种字母->十进制值转换,则可以对字符
“a”
“z”
的unicode标量使用模式匹配

还请注意,如果使用包含多个石墨烯簇的
字符串
实例调用
字符
初始值设定项,则会导致致命的运行时错误(例如
“ab”。代码示例中的值
将产生此类错误)。因此,确定
.value
实际上只对单个字符串“可用”是合适的;例如,返回值
0
,用于除具有字母表字符的单个字符串以外的任何内容

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

备选方案#1:几个
字符串
扩展,如您自己的示例所示

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

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

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

/* 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)

将以上内容应用于特定的
求和(…)
函数 现在,w.r.t.你的编辑

注意

  • 您应该避免在(假定为)
    UITextField
    strInput
    .text
    属性上使用强制展开运算符(
    ),如果该属性为“nil”
  • strInput
    .text
    属性是一个
    字符串
    ,而
    字符串(格式:)
    初始值设定项需要一个
    浮点
    作为其第二个参数
因此,您在
sum(…)
函数中查找的内容很可能与

@IBAction func sum(sender: AnyObject) {
    var decText : String = ""
    if let input = strInput.text {
        decText = input.totalValueAsString
    }
    else {
        decText = "0.00"
    }
    strValue.text = "$" + decText
}
假设您正在使用上述两个
字符串
扩展选项之一


最后,有关在
UITextFields
的一般上下文中显示货币的信息,请参见以下问答:

字母字符到数字值:使用模式匹配 如果希望仅对字母表中的字母允许这种字母->十进制值转换,则可以对字符
“a”
“z”
的unicode标量使用模式匹配

还请注意,如果使用包含多个石墨烯簇的
字符串
实例调用
字符
初始值设定项,将导致致命的运行时错误(例如
“ab”。代码示例中的值
将产生此类错误)因此,确定
.value
实际上仅对单个字符串“可用”是合适的;例如,返回值
0
可用于除具有字母表字符的单个字符串以外的任何字符串

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

备选方案#1:几个
字符串
扩展,如您自己的示例所示

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

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

但是,如果您只对字符的
字符串
的“总值”感兴趣(过滤掉非字母字符),则可以直接应用模式