Java 数字格式本地化问题

Java 数字格式本地化问题,java,localization,number-formatting,jsf-1.2,Java,Localization,Number Formatting,Jsf 1.2,我有一个由用户输入的货币金额,并希望对其进行验证。我已经编写了一个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 我

我有一个由用户输入的货币金额,并希望对其进行验证。我已经编写了一个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;
  }
  ...
我还想确保以下内容被视为无效,但它们都成功解析(当然法语除外)

1234,9.56(无效分组)
1234.567(货币的小数位太多)

任何帮助都将不胜感激

Ian

法国千位分隔符实际上是一个不间断的空格,
\u00a0
。如果输入使用常规空格,则可以更改输入:

input = input.replace(' ', '\u00a0');
您可以做的另一件事是将分组符号更改为常规空格:

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

不过,我不能推荐这个。新的格式化程序不接受使用不间断空格作为分组字符的数字。

谢谢,学到了一些新东西。关于这一点的更多讨论可以在oracle的bug tracker上找到:感谢您的回复,第一部分确实有效,尽管我使用的不是硬代码,而是stringValue.replace(“”,symbols.getGroupingSeparator())关于无效分组和小数位的第二部分有人帮忙吗?(这应该是一个单独的问题!)对于第二部分,您可能需要正则表达式,NumberFormat在解析时不强制使用格式。例如,对于金额>1,需要两位小数,
[1-9]\d{0,2}(?:,\d{3})*\.\d{2}
应该可以。再次感谢Joni,我会试一试的