SOLVED

Rounding an integer to the nearest 100 or 1000

Go to solution  Level 1

Rounding an integer to the nearest 100 or 1000

We have an attribute that represents the number of messages a particular user has sent. Because it seems weird to list the exact number, we want to round this to the closest hundred value. I assume velocity is the way to go and came up with the following but it failed to populate (just remained blank in the sample email send with a confirmed non null value)

Additionally, over tens of thousands of messages, it would be helpful to have the usual (US format) commas in place for sets of 3 orders of magnitude.

Any advice or direction would be much appreciated.

1 ACCEPTED SOLUTION

Accepted Solutions  Level 10 - Community Moderator

Re: Rounding an integer to the nearest 100 or 1000

First: don't use \${formal} references in function calls. They lead to syntax errors because they can't be chained.

Second: \$math.roundTo rounds to decimal places.  That's not the same as "closest hundred." (It also doesn't accept negative decimal places.)

Third: because of the oversimplification of \$math.round (which always uses HALF_EVEN rounding) and Velocity's rather tragic verbosity you need this:

## supply your field and rounding scale

#set( \$toNearest = 100 )

##

## / --- begin rounding routine --- \

## No need to alter this code!

#set( \$String = \$context.getClass().forName("java.lang.String") )

#set( \$NativeMath = \$context.getClass().forName("java.lang.Math") )

#set( \$BigDecimal = \$context.getClass().forName("java.math.BigDecimal") )

#set( \$BigDecimalFromString = \$BigDecimal.getConstructor(\$String) )

#set( \$pointsToMove = \$NativeMath.log10(\$toNearest.doubleValue()).intValue() )

#set( \$rounded = \$BigDecimalFromString.newInstance(

\$valueToRound.toString()

).movePointLeft(

\$pointsToMove

).setScale(

0,

\$field.in(\$BigDecimal).ROUND_HALF_UP

).movePointRight(

\$pointsToMove

)

)

## \ --- end rounding routine --- /

Rounded: \${rounded}

There are some alternate ways with \$math.mod but none are as flexible, nor do they use real mathematical methods.

Fourth: the US locale commas are simple:

#set( \$roundedWithCommas = \$number.format('#,###', \$rounded) )

\${roundedWithCommas}

4 REPLIES 4  Level 10 - Community Moderator

Re: Rounding an integer to the nearest 100 or 1000

First: don't use \${formal} references in function calls. They lead to syntax errors because they can't be chained.

Second: \$math.roundTo rounds to decimal places.  That's not the same as "closest hundred." (It also doesn't accept negative decimal places.)

Third: because of the oversimplification of \$math.round (which always uses HALF_EVEN rounding) and Velocity's rather tragic verbosity you need this:

## supply your field and rounding scale

#set( \$toNearest = 100 )

##

## / --- begin rounding routine --- \

## No need to alter this code!

#set( \$String = \$context.getClass().forName("java.lang.String") )

#set( \$NativeMath = \$context.getClass().forName("java.lang.Math") )

#set( \$BigDecimal = \$context.getClass().forName("java.math.BigDecimal") )

#set( \$BigDecimalFromString = \$BigDecimal.getConstructor(\$String) )

#set( \$pointsToMove = \$NativeMath.log10(\$toNearest.doubleValue()).intValue() )

#set( \$rounded = \$BigDecimalFromString.newInstance(

\$valueToRound.toString()

).movePointLeft(

\$pointsToMove

).setScale(

0,

\$field.in(\$BigDecimal).ROUND_HALF_UP

).movePointRight(

\$pointsToMove

)

)

## \ --- end rounding routine --- /

Rounded: \${rounded}

There are some alternate ways with \$math.mod but none are as flexible, nor do they use real mathematical methods.

Fourth: the US locale commas are simple:

#set( \$roundedWithCommas = \$number.format('#,###', \$rounded) )

\${roundedWithCommas}  Level 10 - Community Moderator

Re: Rounding an integer to the nearest 100 or 1000  Level 10 - Community Moderator

Re: Rounding an integer to the nearest 100 or 1000  