Установить точку (".") Как десятичный разделитель в 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.