2012-03-08 3 views
2

У меня есть денежная сумма, введенная пользователем и требующая ее проверки. Я написал валидатор JSF, но у меня возникли проблемы с его работой при любых обстоятельствах. Вот мой сценарий:
У меня есть пользователи в разной Locales и поэтому мне нужно, чтобы справиться с различными способами ввода и хочу, чтобы следующиеПроблемы с локализацией номерной области

English 
1234 
1,234 
1234.56 
1,234.5 

German & Spanish 
1234 
1.234 
1234,56 
1.234,5 

French 
1234 
1 234 
1234,56 
1 234,5 

Моя проблема с французами в качестве опции 2 & 4 видн как недопустимый, используя этот код, поскольку синтаксический анализ останавливается в пространстве.

public void validate(final FacesContext pContext, 
        final UIComponent pComponent, 
        final Object pValue) { 

    boolean isValid = true; 
    final Locale locale = (Locale)pComponent.getAttributes().get(USERS_LOCALE); 
    final Currency currency = (Currency)pComponent.getAttributes().get(CURRENCY); 

    final NumberFormat formatter = NumberFormat.getNumberInstance(locale); 
    formatter.setGroupingUsed(true); 
    formatter.setMinimumFractionDigits(currency.getDefaultFractionDigits()); 
    formatter.setMaximumFractionDigits(currency.getDefaultFractionDigits()); 
    final ParsePosition pos = new ParsePosition(0); 
    final String stringValue = (String)pValue; 

    if (pos.getIndex() != stringValue.length() || pos.getErrorIndex() != -1) { 
    isValid = false; 
    } 
    ... 

Я также хочу, чтобы убедиться, что следующий рассматривается как недействительные, но все они разобраны

1,234,9.56 (Invalid группировка)
1,234.567 (слишком много знаков после запятой (для французского языка, конечно, за исключением) за валюту)

Любая помощь будет высоко ценится
Ян

ответ

5

сепаратор французы тысячной на самом деле не-! BREAK ng space, \u00a0. Если вход используется регулярное пространство вы можете изменить вход:

input = input.replace(' ', '\u00a0'); 

Другая вещь, которую вы можете сделать, это изменить символ группировки в регулярном пространстве:

DecimalFormat decimalFormatter = (DecimalFormat) formatter; 
DecimalFormatSymbols symbols = decimalFormatter.getDecimalFormatSymbols(); 
symbols.setGroupingSeparator(' '); 
decimalFormatter.setDecimalFormatSymbols(symbols); 

не могу рекомендовать это, хотя. Новый форматтер не будет принимать числа, которые используют неразрывное пространство в качестве символа группировки.

+0

Спасибо, узнали что-то новое. Более подробно об этом можно узнать в отладчике ошибок oracle: http://bugs.sun.com/view_bug.do?bug_id=4510618 –

+0

Спасибо за ответы, первый сделал работу, хотя вместо жесткого кода я использовал stringValue.replace ('', symbols.getGroupingSeparator()) – bluesky

+0

Кто-нибудь поможет со второй частью относительно недопустимых группировок и десятичных знаков? (вероятно, это задало отдельный вопрос!) – bluesky

Смежные вопросы