Вопрос

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

У меня есть пользователи в разных локалях, и поэтому мне нужно справиться с различными методами ввода и хотеть разрешить следующее

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 (неверная группировка)


1,234,567 (слишком много десятичных знаков для валюты)

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

Это было полезно?

Решение

Сепаратор французских тысяч на самом деле является невыполненным пространством, генеракодицетагкодом.Если ваш вход использует регулярное пространство, вы можете изменить вход:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top