[ 
https://issues.apache.org/struts/browse/WW-2176?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_42289
 ] 

Amaury Crickx commented on WW-2176:
-----------------------------------

Same is true for quite a few other European locales (French, Danish, ...)

Due to some nasty feature of the java platform, parsing 10,0 with English 
locale succeeds with a value of 100. 
So what we have here is when your locale has '.' as thousand separator, your 
number becomes 100.
The real problem is actually that the number is not formatted back to string 
using your locale.

This issue is related to known issues in xwork : 
http://jira.opensymphony.com/browse/XW-490 : 
XWorkBasicConverter.doConvertToString(...) ignores Locale for instances of 
Number
http://jira.opensymphony.com/browse/XW-543 : XWorkBasicConverter broken with 
primitives

XW-490 comments state it clear : locale is used when parsing from String to 
Float or Double objects (not primitives) but NOT when formatting from 
Double/Float to String
Fixing the problem brought nasty side effect like url params being formatted 
with the thousand separator : ?id=1,234 instead of ?id=1234
Bringing locale specific formatting into bookmarkable urls is IMHO not a good 
idea. 
This bug has been rescheduled to xwork 2.1 with a possible outcome of won't fix 
, let the view handle this.
Personally, I'd say that parsing using locale and formatting without is not an 
intuitive behavior either. 
Actually, it will be difficult to document without giving a feeling of code 
smell ;-)

I also mentioned issue XW-543 because it appears that for the moment primitive 
numbers are not parsed using the same code in XWorkBasicConverter but rather 
delegated to OGNL which doesn't handle locale at all...


Back to this bug : there is a way to fix this, but I wouldn't call it elegant.

In the showCase app, there is a resource bundle called 
globalMessages.properties where the following line should be added 
(no need to add it to all locales : I don't add text and the formatting will 
use the current locale):
number={0,number}

Then modify editEmployee.jsp and replace the line
<s:textfield label="Salary" name="currentEmployee.salary"/>

with 

<s:text name="number" var="formattedSalary"><s:param 
value="currentEmployee.salary"/></s:text>
<s:textfield label="Salary" name="currentEmployee.salary" 
value="%{formattedSalary}"/>

Note that depending on your version you may have to use "id" instead of "var" 
as text tag attribute.
Which basically means: 

1. get the salary Float object from current employee and have it added to a 
List of arguments, 
search resource bundles to find the key 'number', 
parse the given message value and replace parameters with converted/formatted 
value
push result to formattedSalary on the stack

2. when displaying textfield, use the stack value.

It works but... I wished I could specify a formatter directly into the 
textfield tag or have a FormattedTextField tag (à la Swing) or ... anything 
that could ease the pain of localized numbers
I'm wishing to help if I can...

> In Turkish locale "TR" double values are multiplied by ten on every page load
> -----------------------------------------------------------------------------
>
>                 Key: WW-2176
>                 URL: https://issues.apache.org/struts/browse/WW-2176
>             Project: Struts 2
>          Issue Type: Bug
>    Affects Versions: 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.0.7, 
> 2.0.8, 2.0.9, 2.1.0
>         Environment: Windows XP, java 5 and java 6
>            Reporter: Ömer Başar
>            Priority: Blocker
>             Fix For: 2.0.12
>
>         Attachments: struts2locale_error.avi
>
>
> The steps to get the error.
> 1 - Change your locale to "TR" (Turkish)
> 2 - go to edit employee page on showcase application - 
> http://www.planetstruts.org/struts2-showcase/employee/save.action
> 3 - Fill only the salary field with "10"
> 4 - Press Save, it shows the required fields and makes the salary field "10.0"
> 5 - Press Save again without editing anything, it gives the error for 
> required fields and makes the salary field "100.0"
> 6 - Alter the salary field. Make it "100,0" (change dot with comma)
> 7 - press save, here it is not multiplied by 10, but it changes the salary 
> field value from "100,0" to "100.0" again.
> Here is the problem. In Turkish(TR) locale the decimal separator is "comma", 
> not "dot". So it doesn't convert them according to the TR locale which is the 
> locale of my browser. When I press save at the 4th and 5th steps it should 
> write "10,0" using the locale of the browser. 
> Note : When I change my locale to "EN" everything works fine. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to