Точка сили (“.”) Як десятковий роздільник в java


103

В даний час я використовую наступний код для друку подвійного:

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

Це добре працює, за винятком того, що Java використовує десятковий розділювач моїй локалі (кома), тоді як я хотів би використовувати крапку. Чи є простий спосіб це зробити?


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

Відповіді:


172

Використовуйте перевантаження, String.formatяке дозволяє вказати локаль:

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

Якщо ви лише форматуєте номер - як ви тут, - використання NumberFormat, можливо, було б більш доречним. Але якщо вам потрібні інші можливості форматування String.format, це повинно працювати добре.


6
Місце розташування.ROOT є більш нейтральним.
speedogoo

@speedogoo: Відредаговано, хоча я підозрюю, що для форматування чисел це не має ніякого значення.
Джон Скіт

1
Так, але вам не потрібно вибирати між США та Великобританією. 😜
speedogoo

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

IMO це не відповідає на питання, скоріше Locale.setDefault (новий Locale ("en", "US")); робить, як зазначено в іншій відповіді. Правда, що, можливо, є небажані побічні ефекти, як це глобально, OTH як програміст, що я дійсно хочу, це те, що глобальний дефолт - це США, оскільки скрізь у моєму коді, де я дбаю про локаль, я роблю це явно.
nyholku

21

Більш різке рішення - встановити свій локальний ресурс на початку main ().

Подібно до:

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

11
Це дуже проблемна відповідь, оскільки вона має глобальний ефект, тому може спричинити безліч інших (можливо небажаних) змін.
sleske

2
IMO - це правильна відповідь на питання, і, крім програміста, це те, що я хочу. Я хочу, щоб Java використовувала локальний код США за замовчуванням, як і скрізь у своєму коді, де мені фактично потрібна локалізація, я зроблю це явним у своєму коді. Мої звички, можливо, але це дуже дратує, коли printf / format використовує мій локальний Locale, тому десяткова "кома" абсолютно не сумісна з іншим програмним забезпеченням (будь-яким з Matlab).
nyholku

10

Ви можете передати додатковий Locale в 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та встановлення роздільника потрібно робити один раз, перед цим методом.
рядок

0

Ви можете використовувати NumberFormat та DecimalFormat.

Ознайомтесь із цим посиланням з Java-підручників 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.