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)
#set ($rounded_number = $math.roundTo(2, ${lead.Message_Volume__c_contact}))
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.
Solved! Go to Solution.
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( $valueToRound = $lead.Message_Volume__c_contact )
#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}
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( $valueToRound = $lead.Message_Volume__c_contact )
#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}
Arjun Naskar please return to this thread and read the supplied answer.
Again Arjun Naskar please return to this thread and read the supplied answer.
Very helpful. Thank you!