在字符串中查找数字并计算,在字符串中插入(Swift)

Posted

技术标签:

【中文标题】在字符串中查找数字并计算,在字符串中插入(Swift)【英文标题】:Find numbers in String and compute, insert back in String (Swift) 【发布时间】:2016-05-19 07:02:01 【问题描述】:

我正在尝试在我的食谱管理器应用中提供配料缩放功能。 缩放结果仅用于显示目的,不会持久化。

假设我们有一份炒饭食谱,其成分由2 bowls of rice, 1 egg, 1 tbsp soy sauce 组成,这是 2 人份。

在这个数字“2”中有 - 和 + 按钮来增加/减少服务,看起来像 - 2 +

每当按下 - 和 + 图标时,它将运行一个函数以从成分字符串中获取数字并获取 1 份的成分数量。食谱数据可以以任何份量保存,因此为了缩放,我总是需要从 1 份开始。 根据我这里的例子,一份配料的数量应该是1 bowls of rice, 0.5 egg, 0.5 tbsp soy sauce,因此是[1, 0.5, 0.5]

然后我可以根据用户操作调整成分数量。 到目前为止,我已经弄清楚了以下内容,它将数字字符串从整个成分字符串中取出,将其制成一个数组并将其转换为 Int 数组。

if recipe.ingredients != "" 
    let ingredientStr = recipe.ingredients
    let numStr = ingredientStr?.componentsSeparatedByCharactersInSet(
                    NSCharacterSet
                        .decimalDigitCharacterSet()
                        .invertedSet)
    let array = numStr!.filter( $0 != "" )
    var intArray = array.map Int($0)! 

我尝试了各种方法来计算此处的数字,但未能获得预期的数字。我没有完成的是:

获得 1 份量 根据 +、- 操作缩放数量 将算术结果插回原字符串中显示

【问题讨论】:

我认为你是从错误的一端接近这个。您的数据源应该是包含所有成分(作为字符串)和数量(作为数字)的某种结构,例如一个结构数组。然后您可以轻松修改金额。您可以从该数据源创建用于显示的文本表示。 是的,你是对的。理想的数据模型是将数量和成分分开。但除了缩放功能,我不会提供任何处理成分部分的东西,所以我选择了一种简单的方法。将它变成一个完整的字符串有一个好处,比如在移动设备上更容易输入等等。如果我想在给定的情况下提供这样的功能,我只是在寻找一种解决方法。 这是[2碗米饭,1个鸡蛋,1汤匙酱油]阵列吗? @Madhumitha 不,它是一个字符串。我用[] 包裹只是为了展示。我已在问题中将其删除以避免混淆。谢谢。 【参考方案1】:

这是你需要的吗?

extension Float 
    var cleanValue: String 
        return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
    


let item = "1 bowls of rice, 0.5 egg, 0.5 tbsp soy sauce"

func computeServing(inputString: String, servingCount:Int) -> String 
    var components = item.componentsSeparatedByString(" ")

    for idx in 0..<components.count 
        if let integer = Int(components[idx])
            components[idx] = String(integer * servingCount)
         else if let float = Float(components[idx])
            components[idx] = String((float * Float(servingCount)).cleanValue)
        
    

    return components.joinWithSeparator(" ")



computeServing(item, servingCount: 3)

【讨论】:

【参考方案2】:

下面从字符串中提取成分信息。基于此,您可以操作数据并简单地再次加入组件。 (对你来说还有一点挑战;))

func extractInfo(text: String!) -> [(String, Double)] 

    let regex = try! NSRegularExpression(pattern: "(([0-9.]+)([^0-9]+))", options: [])
    let nsString = text as NSString
    let results = regex.matchesInString(text, options: [], range: NSMakeRange(0, nsString.length))

    return results.map 
        (nsString.substringWithRange($0.rangeAtIndex(3)), Double(nsString.substringWithRange($0.rangeAtIndex(2)))!)
    


let input = "12 bowls of rice, 1 egg, 0.5 tbsp soy sauce"
extractInfo(input)

它为给定的输入输出:

[("碗饭,", 12), ("鸡蛋,", 1), ("汤匙酱油", 0.5)]

请注意,给定的代码根本不进行错误处理。它强制解包可选的已解析 Double 并期望每个正则表达式匹配包含 4 个组 - 在实际执行 ti 之前应检查所有组以避免程序崩溃。

【讨论】:

以上是关于在字符串中查找数字并计算,在字符串中插入(Swift)的主要内容,如果未能解决你的问题,请参考以下文章

Excel vba 将数字转换成字符串的函数是哪个

在 XML 文件中查找并增加数字

用字符串中的任何字符查找任何数字和空格的匹配模式并替换为 |在 PHP [关闭]

查找字符串中的特定数字并赋值

在字符串中的连续数字后面插入字符串?

c语言 查找最大元素