Дано:
Locale userLocale = Locale.forLanguageTag("uk-UK");
DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getInstance(userLocale);
decimalFormat.setParseBigDecimal(true);
System.out.println(decimalFormat.parse("123456,99").toString()); // output: 123456.99 -> it's OK
System.out.println(decimalFormat.parse("123456Test99").toString()); // output: 123456 -> it's BAD
Ожидается:
ParseException при последнем вводе.
- Почему бы не выполнить быструю проверку, выбранную разработчиками jdk?
- Как вы справляетесь с такими делами?
Моя текущая попытка:
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
import static java.lang.Character.isDigit;
private BigDecimal processNumber(DecimalFormat numberFormat, String rowValue) throws ParseException {
BigDecimal value = null;
if (rowValue == null) return null;
final char groupingSeparator = numberFormat.getDecimalFormatSymbols().getGroupingSeparator();
final char decimalSeparator = numberFormat.getDecimalFormatSymbols().getDecimalSeparator();
final char minusSign = numberFormat.getDecimalFormatSymbols().getMinusSign();
for (char ch : rowValue.toCharArray())
if (!isDigit(ch) && ch != decimalSeparator && ch != groupingSeparator && ch != minusSign)
throw new ParseException("", 0); // wrong pos, I know, but it's excessively here
if (!rowValue.isEmpty())
value = new BigDecimal(numberFormat.parse(rowValue).toString());
return value;
}