I am using:
* SmartClient Version: v8.3p_2013-04-23/PowerEdition Deployment (built 2013-04-23)
* Firefox version 11.0
Our application expects users to enter large decimal values; for example 21 digits before the decimal point and 9 digits after it. We need to convert these large numbers to include thousand separators; e.g. a user enters “1234567891234567890.1234567” and we convert it to “12,345,678,901,234,567,890.1234567”. We use setEditorValueFormatter and setEditorValueParser; these are replicated in the example code below. However, when we enter a value that is bigger than the maximum a Long can hold (i.e. 2^63 – 1, or 9223372036854775807), the value is set to this maximum + 1. To give you an example, we entered 12345678901234567890 (see attached screenshot fig1.png) and the formatter changed it to 9,223,372,036,854,775,808.00 (see attached screenshot fig2.png).
Is there a fault in SGWT whereby a large number is always passed to the Formatter as a Long rather than a Double?
Your help in this matter will be greatly appreciated.
Many thanks.
* SmartClient Version: v8.3p_2013-04-23/PowerEdition Deployment (built 2013-04-23)
* Firefox version 11.0
Our application expects users to enter large decimal values; for example 21 digits before the decimal point and 9 digits after it. We need to convert these large numbers to include thousand separators; e.g. a user enters “1234567891234567890.1234567” and we convert it to “12,345,678,901,234,567,890.1234567”. We use setEditorValueFormatter and setEditorValueParser; these are replicated in the example code below. However, when we enter a value that is bigger than the maximum a Long can hold (i.e. 2^63 – 1, or 9223372036854775807), the value is set to this maximum + 1. To give you an example, we entered 12345678901234567890 (see attached screenshot fig1.png) and the formatter changed it to 9,223,372,036,854,775,808.00 (see attached screenshot fig2.png).
Is there a fault in SGWT whereby a large number is always passed to the Formatter as a Long rather than a Double?
Your help in this matter will be greatly appreciated.
Many thanks.
Code:
package com.tracefinancial.myApp.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.i18n.client.NumberFormat; import com.smartgwt.client.data.Record; import com.smartgwt.client.widgets.form.*; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.TextItem; /** * TODO * @author INSERT USERNAME INTO TEMPLATE HERE */ public class GPTest implements EntryPoint { public void onModuleLoad() { DynamicForm frm = new DynamicForm(); final NumberFormat fmt = NumberFormat.getFormat("#,##0.00"); TextItem money = new TextItem("MyMoney"); money.setWidth(200); money.setEditorValueFormatter(new FormItemValueFormatter() { @Override public String formatValue(Object value, Record record, DynamicForm dynamicForm, FormItem formItem) { if (value == null) { return null; } else { try { if (value instanceof Integer) { return fmt.format((Integer)value); } else { return fmt.format(Double.valueOf(value.toString())); } } catch (NumberFormatException ignore) { return value.toString(); } } } }); money.setEditorValueParser(new FormItemValueParser() { @Override public Object parseValue(String value, DynamicForm form, FormItem item) { if (value == null || value.isEmpty()) { return null; } else { try { return fmt.parse(value); } catch (NumberFormatException ignore) { return value; } } } }); TextItem nextField = new TextItem("nextField"); nextField.setWidth(200); frm.setFields(money, nextField); frm.show(); } }
Comment