2012-05-02 1 views
14

Как использовать NumberFormat для форматирования значения double для заданного Locale (по умолчанию для локали) и для заданного количества десятичных знаков?Как форматировать двойное значение для данного языка и числа десятичных знаков?

Например, у меня есть эти значения:

double d1 = 123456.78; 
double d2 = 567890; 

И я хочу, чтобы напечатать их следующим образом, например, с США локали и 2 знака после запятой:

123,456.78 
567,890.00 

Я не» t действительно заботятся о режиме округления в этом случае, потому что эти двойные значения получены от BigDecimal с заданным масштабом, поэтому их количество десятичных знаков всегда меньше или равно числу десятичных знаков, которые я хочу напечатать.

Edit:

Чтобы сделать вещи немного более ясно, дело в том, что я хочу, чтобы отобразить деньги в локали зависимого пути, но с фиксированным количеством знаков после запятой. В приведенном выше примере показано, как значения должны быть отформатированы, если локаль системы en_US. Теперь давайте говорить, система локаль cs_CZ (Чехия), так же номера должны быть отформатированы таким образом:

123 456,78 
567 890,00 

Теперь, как я могу настроить NumberFormat всегда отображать 2 знака после запятой, но для отображения разделитель тысяч и десятичная точка на основе текущей локали?

ответ

36

Если вы заботитесь читать документацию NumberFormat, решение было бы очевидно:

double d1 = 123456.78; 
double d2 = 567890; 
// self commenting issue, the code is easier to understand 
Locale fmtLocale = Locale.getDefault(Category.FORMAT); 
NumberFormat formatter = NumberFormat.getInstance(fmtLocale); 
formatter.setMaximumFractionDigits(2); 
formatter.setMinimumFractionDigits(2); 
System.out.println(formatter.format(d1)); 
System.out.println(formatter.format(d2)); 
System.out.println(fmtLocale.toLanguageTag()); 

На моей машине это печатает:

123 456,78
567 890,00
pl-PL

Я считаю, что это то, что вы ищете, d вам не нужно испортить шаблоны. Я бы этого не сделал - например, есть локали, которые группируют цифры на два, а не на три (это причина, по которой мы говорим о разделителе группировки и не000 separator).

+0

Спасибо большое – Sayka

+0

@ Paweł Dyda Как я должен преобразовать строку 123,456.78 в США местности с двойным значением 123456.78? – KJEjava48

3

Вы могли бы использовать что-то вроде

DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(); 
formatter.applyPattern("#,###,##0.00"); 
formatter.format(yourDoubleHere) 
7

Адаптировано из Customizing Formats,

public void localizedFormat(double value,Locale loc) { 

    NumberFormat nf = NumberFormat.getNumberInstance(loc); 
    DecimalFormat df = (DecimalFormat)nf; 
    df.applyPattern("###,###.00"); 
    String output = df.format(value); 

    } 

Эта функция должна дать вам необходимую форматирование.

0

преобразует двойное значение в двойное значение с любым числом цифр после десятичного числа. Я создал этот метод в классе Utility для доступа к нему через проект.

public static double convertToDecimal(double doubleValue, int numOfDecimals) { 
     BigDecimal bd = new BigDecimal(doubleValue); 
     bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP); 
     return bd.doubleValue(); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^