Converteren van tekst naar getallen in Velocity

In de template van de feature-info kun je in Velocity-code velden met elkaar of met een constante vergelijken. Het probleem daarbij is dat de veldwaarden, ook die van de numerieke velden, in de feature-info altijd als tekst worden geïnterpreteerd en dus altijd alfabetisch worden vergeleken. 

Een voorbeeld van een vergelijking is de volgende Velocity-code:

#if ($waarde > 100)
 Groot
#else
 Klein
#end

Omdat de veldwaarden alfabetisch vergeleken worden, doet deze conditionele expressie (if-else-statement) niet wat je verwacht. Alfabetisch gezien is de waarde '80' namelijk groter dan '100' en bij de waarde '80' zal de expressie 'Groot' als resultaat teruggeven. Wanneer je numerieke velden in een vergelijking wilt gebruiken, moet de tekst dus eerst in een getal omgezet worden. Hiervoor gebruik je de functie ConvertToDouble van hulpvariabele $NVHelper. De algemene syntax is als volgt:

$NVHelper.ConvertToDouble($value [, cultureCode] [, strictMode])

De functie ConvertToDouble converteert een alfanumerieke waarde in een reëel getal en gebruikt daarvoor de volgende drie argumenten:

  • $value (verplicht)

    Een variabele voor het veld waarvan de waarde naar een getal moet worden geconverteerd.

    Voorbeelden (het resultaat is steeds een reëel getal):

    $NVHelper.ConvertToDouble("314")     = 314
    $NVHelper.ConvertToDouble("3.14")    = 3,14
    $NVHelper.ConvertToDouble("3punt14") = 0
    $NVHelper.ConvertToDouble(" ")       = NULL


    Als de waarde niet in een getal is te converteren, zal de functie het getal '0' of een foutmelding teruggeven (afhankelijk van de waarde van het argument strictMode). Indien een veld niet is ingevuld en dus de waarde NULL heeft, zal de functie na conversie ook de waarde NULL teruggeven. De functie behandelt ook een lege string of witruimte als waarde NULL, dat wil zeggen dat velden met een dergelijke waarde ook beschouwd worden als oningevuld. In de feature-info zal in dat geval geen waarde worden getoond of de naam van de variabele verschijnen.

  • cultureCode (optioneel)

    Een code voor het land en de taal waarvan de getalnotatie wordt gebruikt. De code geeft eerst de taal en vervolgens het land, bijvoorbeeld es-AR voor Spaans in Argentinië. Zie voor de verschillende codes het overzicht van Azulia Designs (azuliadesigns.com/list-net-culture-country-codes).

    Vooral bij het gebruik van de decimale punt of komma speelt deze code een rol (zie onderdeel 'Weergave van getallen en datums' van de Handleiding WGP Beheer). Zo zal met land/taalcode en-US de waarde '3.14159' geconverteerd worden naar het getal 3,14159. Met code nl-NL zal de waarde omgezet worden in het getal '314150', omdat de scheidingstekens voor duizendtallen worden genegeerd. Waarde '3.141,59' wordt zo met code en-US geconverteerd naar het getal '3,14159'.

    Voorbeelden (resultaat is steeds een reëel getal):

    $NVHelper.ConvertToDouble("3,14", "nl-NL")     = 3,14
    $NVHelper.ConvertToDouble("3komma14", "nl-NL") = 0
    $NVHelper.ConvertToDouble("3punt14", "en-US")  = 0
    $NVHelper.ConvertToDouble("3.14", "en-US")     = 3,14


    Bij het ontbreken van een land/taalcode, zal standaard de code en-US worden gebruikt.

  • strictMode (optioneel)

    Een argument dat de waarden true of false kan hebben en die aangeeft of de functie bij een niet te converteren variabele een foutmelding moet teruggeven (strictMode = true) of de waarde '0' (strictMode = false).

    Voorbeelden (resultaat is een reëel getal of een foutmelding):

    $NVHelper.ConvertToDouble("3,14","nl-NL",true)      = 3,14
    $NVHelper.ConvertToDouble("3punt14","nl-NL",true)   geeft foutmelding
    $NVHelper.ConvertToDouble("3punt14","nl-NL",false)  = 0

    Bij het ontbreken van argument strictMode, zal standaard de waarde strictMode = false worden gebruikt.

Na de conversie naar een getal kun je wel de veldwaarden in een vergelijking opnemen. Voor veld variabele $numeric_value ziet de code met een conditionele vergelijking er dan bijvoorbeeld als volgt uit:

#set($value_double = $NVHelper.ConvertToDouble($numeric_value))
#if ($value_double > 100)
 De waarde is groot.
#else
 De waarde is klein.
#end