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:压缩模式匹配
但是,如果您只对字符的字符串
的“总值”感兴趣(过滤掉非字母字符),则可以直接应用模式