2011-01-17 3 views
38

Учитывая локализованную java.text.NumberFormat:Десятичный разделитель в NumberFormat

NumberFormat numberFormat = NumberFormat.getInstance(); 

Как я могу получить символ, используемый в качестве десятичного разделителя (если это запятая или точка) в этом NumberFormat? Как изменить это свойство, не используя новый формат DecimalFormat (format)?

Благодаря

ответ

66

вспомогательный класс DecimalFomatSymbols является то, что вы ищете:

DecimalFormat format=DecimalFormat.getInstance(); 
DecimalFormatSymbols symbols=format.getDecimalFormatSymbols(); 
char sep=symbols.getDecimalSeparator(); 

Чтобы задать вам символы, необходимо:

//create a new instance 
DecimalFormatSymbols custom=new DecimalFormatSymbols(); 
custom.setDecimalSeparator(','); 
format.setDecimalFormatSymbols(custom); 

EDIT: этот ответ действителен только для DecimalFormat, а не для NumberFormat как требуется в вопросе. Во всяком случае, поскольку это может помочь автору, я позволю ему сюда.

+0

Для записи Numberformat является абстрактным классом, поэтому вы, вероятно, фактически имеете объект DecimalFormat. – redcalx

+1

@locster: либо 'DecimalFormat', либо' ChoiceFormat', либо недокументированная JDK-приватная реализация NumberFormat или ... –

+18

Для записи эта строка _DecimalFormat format = DecimalFormat.getInstance(); _ не делает компилируется, поскольку метод getInstance() возвращает объект NumberFormat. – Chexpir

2

Если ваш NumberFormat экземпляр является DecimalFormat, то вы можете использовать getDecimalFormatSymbols(), чтобы добраться до этой информации.

В общем, вы не можете добраться до этой информации.

Зачем вам это нужно?

+1

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

+0

Хорошая точка. Я забыл, что он использовал NumberFormat, а не DecimalFormat. –

+0

Вы можете установить DecimalFormatSymbols по умолчанию для Locale. –

5

Я согласен с biziclop и Joachim Sauer что баловаться с десятичной и разделителей группировки и делать эту работу вручную, может вызвать много проблем. Использование параметра locale в методе getInstance NumberFormat делает всю работу за вас автоматически. И вы можете легко отключить тысячу разделителей групп, если хотите.

Следующий метод тестирования junit (который проходит) показывает это поведение на основе английского и немецкого языков.

public void testFormatter() { 
    DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(Locale.UK); 
    assertEquals('.', formatter.getDecimalFormatSymbols().getDecimalSeparator()); //true 

    formatter = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN); 
    assertEquals(',', formatter.getDecimalFormatSymbols().getDecimalSeparator()); //true 

    //and in case you want another decimal seperator for a specific locale 
    DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(); 
    decimalFormatSymbols.setDecimalSeparator('.'); 

    formatter.setDecimalFormatSymbols(decimalFormatSymbols); 
    assertEquals('.', formatter.getDecimalFormatSymbols().getDecimalSeparator()); //true 
} 
Смежные вопросы