Reputation: 41
I'm a newer develop, I'm working on a project with jsp, freemarker and java-ee. My problem is that I can't convert a string to double with freemarker. I'm using a form to with a double input, if the the input is an integer the validation is done without error, if it's a number with comma, I get an exception said:
FreeMarker template error: Can't convert this string to number: "43,5"
here is my model :
@Table public class BalanceConfig extends BaseObject implements Serializable {
@Id(sequence = "SEQ_BALANCE_CONFIG")
@SearchCriteria
protected Long id;
@ManyToOne
@SearchCriteria
private Balance balance;
@OneToMany(clazz = BalanceConfigProfile.class, cascade = CascadeType.REMOVE)
@SearchCriteria
private List<BalanceConfigProfile> balanceConfigProfiles;
@OneToMany(clazz = BalanceUsage.class, cascade = CascadeType.REMOVE)
@SearchCriteria
private List<BalanceUsage> balanceUsages;
@Column
@SearchCriteria
private Long balanceId;
@Column
@SearchCriteria(type = SearchCriteriaType.LIKE)
private String name;
@Column
@SearchCriteria
private String unit;
@Column
@SearchCriteria
private String family;
@Column
@SearchCriteria
private Double conversionRate;
@Column
@SearchCriteria
private Integer priority;
@Column
@SearchCriteria
private Date startDate;
@Column
@SearchCriteria
private Date endDate;
@Column
@SearchCriteria
private Boolean zeroVisibility;
@Column
@SearchCriteria
private Boolean portailVisibility;
@Column
@SearchCriteria
private Boolean crmVisibility;
@Column
@SearchCriteria
private Boolean selfcareVisibility;
@Column
@SearchCriteria
private Boolean endDateVisibility;
@Column
@SearchCriteria
private Boolean defaultConfig;
getters and setters;
}
the template is :
{
"id" : "${balanceConfig.id}",
"balanceId" : "${balanceConfig.balanceId}",
"balanceCode" : "${balanceConfig.balance.code}",
"name" : "<#if balanceConfig.name??>${balanceConfig.name?json_string}</#if>",
"unit" : "<#if balanceConfig.unit??>${balanceConfig.unit?json_string}</#if>",
"family" : "<#if balanceConfig.family??>${balanceConfig.family?json_string}</#if>",
"conversionRate" : "<#if balanceConfig.conversionRate??>${balanceConfig.conversionRate?number}</#if>",
"priority" : "<#if balanceConfig.priority??>${balanceConfig.priority?number}</#if>",
"startDate" : "<#if balanceConfig.startDate??>${balanceConfig.startDate?date}</#if>",
"endDate" : "<#if balanceConfig.endDate??>${balanceConfig.endDate?date}</#if>",
"zeroVisibility" : "<#if balanceConfig.zeroVisibility??>${balanceConfig.zeroVisibility?string}</#if>",
"portailVisibility" : "<#if balanceConfig.portailVisibility??>${balanceConfig.portailVisibility?string}</#if>",
"crmVisibility" : "<#if balanceConfig.crmVisibility??>${balanceConfig.crmVisibility?string}</#if>",
"selfcareVisibility" : "<#if balanceConfig.selfcareVisibility??>${balanceConfig.selfcareVisibility?string}</#if>",
"endDateVisibility" : "<#if balanceConfig.endDateVisibility??>${balanceConfig.endDateVisibility?string}</#if>",
"defaultConfig" : "<#if balanceConfig.defaultConfig??>${balanceConfig.defaultConfig?string}</#if>"
}
here is the exception:
FreeMarker template error:
Can't convert this string to number: "43,5"
The blamed expression:
==> balanceConfig.conversionRate?number [in template "balanceconfig.ftl" at line 8, column 70]
The failing instruction (FTL stack trace):
----------
==> ${balanceConfig.conversionRate?number} [in template "balanceconfig.ftl" at line 8, column 68]
----------
Java stack trace (for programmers):
----------
freemarker.core.NonNumericalException: [... Exception message was already printed; see it above ...]
at freemarker.core.NonNumericalException.newMalformedNumberException(NonNumericalException.java:98)
at freemarker.core.StringBuiltins$numberBI.calculateResult(StringBuiltins.java:223)
at freemarker.core.StringBuiltins$StringBuiltIn._eval(StringBuiltins.java:87)
at freemarker.core.Expression.eval(Expression.java:111)
at freemarker.core.Expression.evalAndCoerceToString(Expression.java:115)
at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
at freemarker.core.Environment.visitByHiddingParent(Environment.java:286)
at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:86)
at freemarker.core.Environment.visit(Environment.java:265)
at freemarker.core.MixedContent.accept(MixedContent.java:93)
at freemarker.core.Environment.visit(Environment.java:265)
at freemarker.core.Environment.process(Environment.java:243)
at freemarker.template.Template.process(Template.java:277)
Upvotes: 3
Views: 11779
Reputation: 41
problem solved with some system settings, the number was automatically converted to frensh format with comma. Freemarker's parser doens't recognize a double with comma as a double so I changed the format under Regional and Language >format. and it's work fine thank you.
Upvotes: 1
Reputation: 31122
The problem is that you already have a number in balanceConfig.conversionRate
(and such). Because ?number
is defined as a string-builtin, its left hand operand is automatically converted to string (similarly as ?upper_case
etc. would do it). Then ?number
tries to parse that string to a number. So this is an unnecessary back-and-forth conversion, which does nothing at best. But, it can also fail. FreeMarker converts to internationalized format (which in the locale
set there uses comma as the decimal separator), while ?number
is specifically for parsing computer format strings (such as XS types).
So, I think you should write something like this:
<#-- These you could do outside the template, in configuration: -->
<#setting number_format="computer">
<#setting date_format="iso">
<#setting datetime_format="iso">
<#setting time_format="iso">
...
"family" : "${(balanceConfig.family?json_string)!}",
"conversionRate" : "${balanceConfig.conversionRate!}",
"priority" : "${balanceConfig.priority!}",
"startDate" : "${(balanceConfig.startDate?date)!}",
Upvotes: 2
Reputation: 85
conversionRate not looks like a double value.it shows 43,5.It should be 43.5 or 435.So please check what value is coming in the balanceConfig.conversionRate.
Upvotes: 0