Search code examples
grailsdecimalgsp

Grails - Inputfields shows a dot ('.') instead of (',') for decimal numbers


In an edit.gsp, where I have inputfields for decimal number, the decimal number show up as '3.123' and if I save it: I got error as the decimal point is wrong! It expect a ','. My locale is Sweden. So I have to manually replace dot's with comma for all decimal numbers.

I've looked around the whole week and could not find a solution anywhere. Shouldn't Grails be consistent and show commas when it expect commas in the save? It should work with both BigDecimal and for double.

I have Grails 3.2.4

Here is an example of a "g:field" from an edit-form:

    Bredd: <g:field type="number decimal" name="width" min="20" max="300" required="Y" value="${request1?.width}" style="width: 4em"/>

So, what can I do?


Solution

  • manually replacing dots sounds all horrible and possibly the wrong approach.

    Moved answer segments around

    So an update on the answer since i hit a similar issue today maybe in reverse. Sent through a number of 3333 when validation failed for another reason the number in the field had become 3,333 after the validation failure. If the old validation issue is fixed it will now fail due to comma in the number. The reason turned out to be :

    <g:textField value="${fieldValue(bean: instance, field: 'someField')}"

    upon return changed number to 3,333 when changing this to

    value="${instance.someField}"
    

    Above was actual issue @larand was facing

    I would store the input field width as a short

    so :

    Class MyClass {
    
     //if you are storing a number like 123 (non decimal)
     Short width
     //if you are storing 12.12 which becomes 1212 when stored
     Integer width
    
     BigDecimal getDecimalWidth() {
        return new BigDecimal(this.width).movePointRight(2).setScale(2)
     }
     void setWidth(BigDecimal decimal) {
       this.width=new BigDecimal(decimal).movePointLeft(2).setScale(2)
     }
    //unsure but think this should work
      Integer getWidthInteger() {
        return this.width as int
     }
     void setWidth(Integer integer) {
       this.width=(byte)integer
     }
    }
    

    This will then give you methods to get the short value as big decimal using ${instance.decimalWidth} or as integer : ${instance.widthInteger}

    when your field is actually numeric:

    <g:formatNumber number="${myCurrencyAmount}" type="currency" currencyCode="EUR" />

    To me that seems a lot more straight forward and cleaner than chopping up numbers which well you think about it

    After first validation issue the number was 3333 as put in. So maybe this is your issue ? Unsure since you are talking of dots