#java #android #internationalization #number-formatting #spring-internationalization
#java #Android #интернационализация #форматирование чисел #spring-интернационализация
Вопрос:
Я пытаюсь интернационализировать свое приложение на Android. Я знаю, что в Европе, а также в других частях мира десятичные дроби и числа представлены иначе, чем в США.
Я пытаюсь использовать NumberFormat, чтобы помочь мне изменить строковые входные данные, которые представляют десятичные дроби в Европе. Так, например:
- Строка number1 = «8,765» должна стать «8,77» После форматирования с помощью NumberFormat
- Строка number2 = «1.203» должна стать «1,203» после форматирования с помощью NumberFormat
- Строка number3 = «1.203,5632» должна стать «1.203.56» после форматирования с помощью NumberFormat
У меня есть код, который почти работает до совершенства, но я чего-то не хватает: я не хочу использовать метод String.format . Я хочу использовать NumberFormat.
NumberFormat nformat = NumberFormat.getInstance(Locale.US);
nformat.setMaximumFractionDigits(2);
nformat.setMaximumFractionDigits(2);
String user_string = "8,747";
try{
Number my_number = nformat.parse(user_string);
String result = nformat.format(my_number);
System.out.println("look at result: " result); //this prints: 8,747.00 NOT 8.75
}catch(Exception exception){
}
Как я могу заставить NumberFormat печатать 8,75, А не 8,747.00 . Кроме того, я могу использовать вызов replace ИЛИ replaceAll для user_string, НО я не хочу использовать дополнительные вычисления. Как NumberFormat может справиться с этой проблемой?
Спасибо
Ответ №1:
Прежде чем ответить на ваш вопрос, я хочу сказать вам, чтобы вы не проглатывали исключения. Пустой блок catch — плохой вариант. Редактировать: когда произойдет исключение, вы не будете знать, что пошло не так в вашей программе. Это похоже на кодирование вслепую. В короткой статье, ссылка на которую приведена внизу, более подробно объясняется, как эта практика противоречит целям исключений.
Для преобразования из одного строкового формата в другой строковый формат вам понадобятся два форматера: один для синтаксического анализа и один для форматирования.
NumberFormat europeanInputFormat = NumberFormat.getInstance(Locale.GERMAN);
NumberFormat nformat = NumberFormat.getInstance(Locale.US);
nformat.setMaximumFractionDigits(2);
String user_string = "8,747";
try {
Number my_number = europeanInputFormat.parse(user_string);
String result = nformat.format(my_number);
System.out.println("look at result: " result); // this prints: 8.75
} catch (ParseException | IllegalArgumentException e) {
e.printStackTrace();
}
Вывод:
посмотрите на результат: 8.75
Не все европейские страны используют один и тот же формат. Я впервые использовал Locale.FRENCH
. Это не сработало, потому что французский формат использует пробел, а не точку в качестве разделителя тысяч.
Ссылка
Статья в Википедии о сокрытии ошибок, проглатывании ошибок или проглатывании исключений
Комментарии:
1. Спасибо, это работает отлично, но не для локали. Франция. Кроме того, почему оставлять пустое предложение catch — плохая идея?