输入小于10时如何设计进度条逻辑?

时间:2017-07-08 18:32:54

标签: algorithm go logic progress-bar

我正在解析数组中的字符串,并在解析字符串时显示进度。这是我的逻辑,但是对于小于10的输入,它不会缩放。

在100 * i /(lineLen-1)函数的初始部分已经处理了除以零

progress := 0
for i:= 0; i<lineLen;i++ {
 //.. lineLen = array length
//.....String processing...
if (100*i/(lineLen-1)) >= progress {
     fmt.Printf("--%d%s--", progress, "%")
     progress += 10
}
}

2 个答案:

答案 0 :(得分:1)

我知道您需要将所有百分比降至10的倍数。

您可以尝试以下内容。

lineLen := 4
progress := 0
for i := 0; i < lineLen; i++ {
    // Rounding down to the nearest multiple of 10.
    actualProgress := (100 * (i+1) / lineLen)
    if actualProgress >= progress {
        roundedProgress := (actualProgress / 10) * 10
        // Condition to make sure the previous progress percentage is not repeated.
        if roundedProgress != progress{
            progress = roundedProgress
            fmt.Printf("--%d%s--", progress, "%")
        }
    }
}

Link

答案 1 :(得分:1)

查看https://play.golang.org/p/xtRtk1T_ZW(下面转载的代码):

func main() {
    // outputMax is the number of progress items to print, excluding the 100% completion item.
    // There will always be at least 2 items output: 0% and 100%.
    outputMax := 10

    for lineLen := 1; lineLen < 200; lineLen++ {
        fmt.Printf("lineLen=%-3d    ", lineLen)
        printProgress(lineLen, outputMax)
    }
}

// Calculate the current progress.
func progress(current, max int) int {
    return 100 * current / max
}

// Calculate the number of items in a group.
func groupItems(total, limit int) int {
    v := total / limit
    if total%limit != 0 {
        v++
    }
    return v
}

// Print the progress bar.
func printProgress(lineLen, outputMax int) {
    itemsPerGroup := groupItems(lineLen, outputMax)
    for i := 0; i < lineLen; i++ {
        if i%itemsPerGroup == 0 {
            fmt.Printf("--%d%%--", progress(i, lineLen))
        }
    }
    fmt.Println("--100%--")
}

如果需要,您可以使用https://play.golang.org/p/aR6coeLhAkoutputMaxlineLen的各种值执行循环,以查看您喜欢的outputMax的值(8 <= outputMax < 13对我来说最好看)。默认情况下,进度条的输出处于禁用状态,但您可以在main

中轻松启用它