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

105

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

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

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

dtech
источник
Если вам нужно использовать двойное значение с точными десятичными знаками, возможно, вам стоит использовать 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);
 }
VizGhar
источник
Такое ощущение, что создание DecimalFormatSymbolsи настройку разделителя нужно делать один раз, перед этим методом.
Line
0

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

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

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

блондинка824
источник
-3

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

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

Фред'
источник
1
Это работает только до тех пор, пока кто-нибудь не попытается запустить ваш код на другом языке. Не настоящее решение. -1
Марко Фройденбергер