Формат чисел для интернационализации

#java #android #internationalization #number-formatting #spring-internationalization

#java #Android #интернационализация #форматирование чисел #spring-интернационализация

Вопрос:

Я пытаюсь интернационализировать свое приложение на Android. Я знаю, что в Европе, а также в других частях мира десятичные дроби и числа представлены иначе, чем в США.

Я пытаюсь использовать NumberFormat, чтобы помочь мне изменить строковые входные данные, которые представляют десятичные дроби в Европе. Так, например:

  1. Строка number1 = «8,765» должна стать «8,77» После форматирования с помощью NumberFormat
  2. Строка number2 = «1.203» должна стать «1,203» после форматирования с помощью NumberFormat
  3. Строка 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 — плохая идея?