[
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.