Дважды принимается с запятой вместо точки - PullRequest
0 голосов
/ 30 января 2019

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

Это мой код теста:

import java.util.*;
public class DoubleTest {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);

        double n = sc.nextDouble();
        System.out.println(n);
    } 
}

При следующем вводе 5 я получаю ожидаемые результаты.

user $ java DoubleTest
   5
   5.0

Теперь к интересной части.Я ввожу Double, как объявлено в коде, и это происходит:

user $ java DoubleTest
5.0
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
at DoubleTest.main(DoubleTest.java:6)

И при задании значения 5,0 - это результат:

user $ java DoubleTest
5,0
5.0

Так что кажетсячто . (точка) не работает, а вместо , (запятая) есть.

Я уже проверил свою локаль, но это не должно быть проблемой.

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

1 Ответ

0 голосов
/ 30 января 2019

Ваш Scanner, вероятно, использует Denmark Locale, поскольку он использует , для форматирования двойных переменных вместо значений по умолчанию для США ..

Вот как это можно проверить (Iпопытался локально заставить мой сканер использовать локаль Дании, и он ведет себя так же, как в ваших экспериментах):

Scanner sc = new Scanner(System.in);
System.out.println(sc.locale().getDisplayCountry());

Если это ваш случай, вам нужно настроить его на использование US Locale или любого другогодругое, что вы хотите:

Scanner sc = new Scanner(System.in);
sc.useLocale(Locale.US);
System.out.println(sc.locale().getDisplayCountry());

В качестве альтернативы, если вам нужно принять и ,, и ., вы можете просто использовать форматтер.Вот один пример с NumberFormat, использующим France в качестве локали, который правильно форматирует , и .:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE);
double doubleComma = numberFormat.parse("5,0").doubleValue();
double doubleDot = numberFormat.parse("5.0").doubleValue();

В вашем коде вы должны сделать что-то вроде:

public static void main (String[] args) {
    try{
        Scanner sc = new Scanner(System.in);

        NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE);
        double n = numberFormat.parse(sc.next()).doubleValue();
        System.out.println(n);
    } catch (ParseException e) {
        e.printStackTrace();
    }
} 
...