>

내 bash 터미널에서 프로그램에 doubles 값을 입력 할 수 없습니다. 아래는 왜 그런 일이 발생했는지 알아내는 데 사용한 코드입니다.

이것은 테스트를위한 코드입니다 :

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

    와이즈 비즈  아마도 Scanner 를 사용하고 있습니다  와이즈 비즈   Denmark 를 사용하므로  미국 기본 Locale 대신 이중 변수를 포맷하는 방법 .

    확인하는 방법은 다음과 같습니다 (스캐너에서 덴마크 로캘을 사용하도록 스캐너를 로컬로 설정하려고 시도했으며 실험과 동일한 방식으로 작동 함).

    ,
    
    

    이 경우 미국 . 를 사용하도록 설정해야합니다.  또는 원하는 다른 것 :

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

    또는 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();

  • 이전 angular - 페이지 다시로드시 업데이트 만 보시겠습니까?
  • 다음 haskell - 일반 프로그래밍을 사용하여 모든 TypeRep을 가치있게 얻으십시오