2016-06-13 33 views
1

我是一個較新的開發人員,我正在使用jsp,freemarker和java-ee開發一個項目。我的問題是我無法將字符串轉換爲freemarker的兩倍。如果輸入是一個整數,驗證沒有錯誤,如果它是一個逗號,我得到一個異常說:如何使用freemarker將字符串轉換爲數字?

FreeMarker模板錯誤: 可以'牛逼這個字符串轉換爲數字: 「43,5」

這裏是我的模型:

@Table 公共類BalanceConfig擴展BaseObject實現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; 
} 

模板是:

{ 
    "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>" 
} 

這裏是個例外:

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) 

回答

0

conversionRate不是看起來像一個雙value.it顯示43,5.It應該是43.5或435.So請什麼樣的價值在未來balanceConfig 。兌換率。

+0

即使我輸入一個帶點的雙精度數,該數字也會自動轉換爲雙逗號。我怎樣才能配置JSON響應獲得雙點? –

1

問題是你已經在balanceConfig.conversionRate(以及這樣)有一個號碼。因爲?number被定義爲一個字符串內建函數,所以它的左手操作數會自動轉換爲字符串(類似於?upper_case等等)。然後?number嘗試將該字符串解析爲數字。所以這是一種不必要的來回轉換,最多不會做任何事情。但是,它也可能會失敗。 FreeMarker轉換爲國際化格式(其中locale設置使用逗號作爲小數點分隔符),而?number專門用於解析計算機格式字符串(如XS類型)。

所以,我認爲你應該寫這樣的事情:

<#-- 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)!}", 
+0

問題在某些系統設置下解決,該號碼自動轉換爲以逗號分隔的格式。 Freemarker的解析器不會識別雙倍逗號,因此我更改了區域和語言>格式下的格式。這很好,謝謝。 –

1

問題,一些系統設置解決,數量自動轉換爲frensh格式逗號。 Freemarker的解析器不會識別雙倍逗號,因此我更改了區域和語言>格式下的格式。這很好,謝謝。

+0

+ from me ..這很好,我一直在找這個3天 – user3756817

相關問題