Преобразовать ввод в зависимости от локали BigDecimal? - PullRequest
2 голосов
/ 28 февраля 2012

Я пытаюсь сохранить поле ввода значений в BigDecimal.Который уже работает.Но это дает странные результаты, если я ввожу десятичный разделитель, который не относится к типу локали.

Например:

class Payment {
   BigDecimal amount;
}

<p:inputText id="amount" value="#{payment.amount}">
  <f:convertNumber locale="en"/>
</p:inputText>
<h:outputText value="#{payment.amount}" />

Если я введу 10,10, я получу: 1,010.00

Таким образом, значение принимается равным 1010. Как я могу обойти это?Что я тут не так делаю?

ты

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Запятые не имеют значения при разборе номера английской локали.Необработанные типы Java Number не сохранят никакой информации о форматировании - это просто данные презентации.

Логика для inputText с NumberConverter выглядит следующим образом:

NumberFormat formatter = NumberFormat.getNumberInstance(Locale.ENGLISH);
// NumberConverter turns input string into Number
Number number = formatter.parse("10,10");
// Expression language coerces the Number to BigDecimal
BigDecimal decimal = BigDecimal.valueOf(number.doubleValue());
// On output back to browser:
String output = formatter.format(decimal);
System.out.println(output);

outputText не имеет преобразователя, поэтому просто вызовет toString() для привязки его значения (BigDecimal.)

Я ожидаю, что результаты будут 1,010 и 1010.0 соответственно.

Поведение NumberConverter описано в javadoc .Правила приведения типа EL задокументированы в JSR 245 :

Привести A к типу номера N

  • Если Ais Number, тихо принудительно введите N, используя следующий алгоритм:
    • Если N равно BigDecimal,
      • Если A равно BigInteger, вернуть new BigDecimal(A)
      • В противном случае верните new BigDecimal(A.doubleValue())

Если вы хотите использовать локаль браузера пользователя для интерпретации числовых форматов, удалите атрибут локали.Если вы хотите, чтобы преобразователь обрабатывал и точки, и запятые как десятичные разделители, предоставьте свою собственную реализацию Converter .

0 голосов
/ 25 июня 2015

Как ясно сказал МакДауэл в комментариях, локаль EN утверждает, что это разделитель для тысяч и. является разделителем для десятичной точки .. если вы хотите использовать "," в качестве десятичного разделителя, используйте локаль, которая имеет заданный формат (например, french (fr))

В Java я бы предложил следующее:

// Using french locale as it is in form of "123 456 789,012345"
DecimalFormat df = (DecimalFormat)
NumberFormat.getInstance(Locale.FRENCH);
df.setParseBigDecimal(true);

// Replace all dots (due to the french format) so we handle "." as well as ","
hodnota = hodnota.replace('.', ',');
try {
    return (BigDecimal) df.parseObject(hodnota);
} catch(ParseException e) {
    // TODO: What ever you desire
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...