Установить точку (".") Как десятичный разделитель в java


105

В настоящее время я использую следующий код для печати двойника:

return String.format("%.2f", someDouble);

Это работает хорошо, за исключением того, что в Java используется десятичный разделитель моей локали (запятая), а я хотел бы использовать точку. Есть простой способ сделать это?


Если вам нужно использовать двойное значение с точными десятичными знаками, возможно, вам стоит использовать BigDecimal вместо double / Double. См. Эту ссылку, чтобы узнать о проблемах, с которыми вы можете столкнуться при использовании переменных типа double. Вы также можете попробовать следующее: System.out.println (5.1d + 1.1d); - результат будет 6.199999999999999 вместо 6.2. Я думаю, что кто-то, кто смотрит, как форматировать числа с десятичными знаками, поскольку String должен пропускать двойные переменные.
— разваноне

Ответы:


174

Используйте перегрузку, String.formatкоторая позволяет указать языковой стандарт:

return String.format(Locale.ROOT, "%.2f", someDouble);

Если вы форматируете только число, как здесь, то использование NumberFormat, вероятно, будет более подходящим. Но если вам нужны остальные возможности форматирования String.format, это должно работать нормально.


6
Locale.ROOT более нейтральный.
— speedogoo

@speedogoo: Отредактировано, хотя я подозреваю, что для форматирования чисел это не имеет никакого значения.
— Джон Скит

1
Да, но вам не нужно выбирать между США и Великобританией. 😜
— speedogoo

2
Locale.ROOT также защищен от возможных будущих изменений в выборе страны для десятичного разделителя.
— Аттила Таньи

ИМО это не отвечает на вопрос, а скорее Locale.setDefault (новый Locale ("en", "US")); делает, как указано в другом ответе. Верно, что может иметь нежелательные побочные эффекты, поскольку он является глобальным, OTH как программист, что я действительно хочу, так это то, чтобы глобальное значение по умолчанию было US, потому что везде в моем коде, где меня волнует локаль, я делаю это явно.
— nyholku

21

Более радикальное решение - установить локаль заранее в main ().

Подобно:

Locale.setDefault(new Locale("en", "US"));

11
Это очень проблематичный ответ, потому что он имеет глобальный эффект, поэтому может вызвать множество других (возможно, нежелательных) изменений.
— sleske

2
ИМО, это правильный ответ на вопрос, и, помимо программиста, это то, что я хочу. Я хочу, чтобы Java использовала локаль США по умолчанию, поскольку везде в моем коде, где мне действительно нужна локализация, я сделаю это явным образом в своем коде. Возможно, только мои привычки, но это очень раздражает, когда printf / format использует мою локальную локаль, потому что десятичная «запятая» полностью несовместима с другим программным обеспечением (любой Matlab), которое я использую.
— nyholku

10

Вы можете передать дополнительный языковой стандарт в java.lang.String.format, а также в java.io.PrintStream.printf (например, System.out.printf ()):

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

Это приводит к следующему (на моем ПК):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

См. String.format в Java API.


4
Вы также можете использовать out.printf((Locale)null, ...)или out.format((Locale)null, ...)для получения независимого от локали представления. (и есть еще Locale.ROOT)
— eckes

10

Слишком поздно, но, как уже упоминалось, здесь приводится пример использования NumberFormat(и его подкласса DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

Такое ощущение, что создание DecimalFormatSymbolsи настройку разделителя нужно делать один раз, перед этим методом.
— Line

0

Вы можете использовать NumberFormat и DecimalFormat.

Взгляните на эту ссылку из Java Tutorials LocaleSpecific Formatting

Раздел под названием "Форматирование с учетом локали" - это то, что вам нужно.


-3

У меня была такая же проблема .. 55.1преобразовался в 55,10. Мое быстрое (грязное?) Исправление:

String.format("%.2f", value).replaceAll(",",".");


1
Это работает только до тех пор, пока кто-нибудь не попытается запустить ваш код на другом языке. Не настоящее решение. -1
— Марко Фройденбергер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.