15

I am trying to get a zero-based counter in a Velocity #foreach directive.

if i use:

#foreach ($item in $list)
   item.getName() : $velocityCount
#end

i will get:

Fred : 1
Wilma : 2
Barney : 3

But i need:

Fred : 0
Wilma : 1
Barney : 2

The solution must be as simple as possible from the velocity template's point of view.

EDIT:
I can use:

#foreach ($item in $list)
   #set( $num = $velocityCount - 1 ) //The white space in mandatory
   item.getName() : $num
#end

and it works. But I'm looking for a more elegant solution.

EDIT 2:
I need the one-based counter to be available too. That is, in the same template i will most likely have one #foreach directive that will require a zero-based counter and another #foreach directive that requires a one-base counter.

summerbulb
  • 5,709
  • 8
  • 37
  • 83

4 Answers4

23

If you are using Velocity 1.7 there are $foreach.index (0-based) and $foreach.count (1-based) special vars available inside loops.

$velocityCount is something that was deprecated long time ago afaik.

serg
  • 109,619
  • 77
  • 317
  • 330
8
#set($i = 0)

  #foreach($str in $names)
    #set($i = $i+1)
    $i : $str
 #end
Dhiral Pandya
  • 10,311
  • 4
  • 47
  • 47
2

According to the doc, you can specify:

directive.foreach.counter.initial.value = 0

In velocity.properties file.

starwarswii
  • 2,187
  • 1
  • 16
  • 19
Aleksei
  • 145
  • 1
  • 8
2

Well, you can't have both, obviously--you either need to just do the math when you're displaying, or create a custom directive (and here's the article the SO post links to). For instance, you could have #forEachZeroBased and #forEachOneBased.

Custom directives are very useful sometimes, although IMO this isn't one of them--just do the math, it's the obvious solution, and it's just not that big of a deal.

Community
  • 1
  • 1
Dave Newton
  • 158,873
  • 26
  • 254
  • 302
  • 1
    @summerbulb Obviously I did, since I commented on it and voted it up-like I said, I assumed < 1.7 since the index/count thing is documented in the user guide. – Dave Newton Oct 23 '11 at 13:11