Wczytywanie liczb zmiennoprzecinkowych w aplikacji konsolowej

0

Cześć,

wpisując wartość zmiennoprzecinkową z klawiatury, w konsoli wyświetlany jest błąd:

Wprowadź liczbę: 
1.2
1.2 Nie jest liczbą

proszę o podpowiedź, jak można to rozwiązać.

package com.operacjelogiczne;

import java.util.Scanner;

public class Logarithm {
    
    public static void printLogarithm( double x) {

        if(x <= 0.0) {
            System.err.println("Błąd: x musi być dodatnie.");
            return;
        }
        double result = Math.log(x);
        System.out.println("Logarytm x wynosi " + result);
    }

    public static void main(String[] args) {
        printLogarithm(3.0);
        scanDouble();

    }
    public static void scanDouble() {
        Scanner in = new Scanner(System.in);
        System.out.println("Wprowadź liczbę: ");
        if(!in.hasNextDouble()) {
            String word  = in.next();
            System.err.println(word + " Nie jest liczbą");
            return;
        }
        double x = in.nextDouble();
        printLogarithm(x);
    }
}
3

Na 99% twój problem bierze się z ustawień lokalizacji - w języku polskim znakiem dziesiętnym jest przecinek, a nie kropka. Czyli masz do wyboru:

  1. Albo wpisywać liczby po polsku, tj. 1,2 zamiast 1.2
  2. Albo zmienić ustawienia lokalizacji.

I tutaj zaczyna się zabawa, bo masz dwie opcje: albo zmieniasz lokalizację w konkretnym miejscu:

Scanner in = new Scanner(System.in);
in.useLocale(Locale.ENGLISH); // czyli za każdym razem gdy będziesz tworzył nowy obiekt typu Scanner to będziesz musiał dodawać tę linijkę

albo można zmienić ustawienia globalne (tj. ustawiasz je na starcie, raz na cały czas). I znowu masz dwie opcje do wyboru:

  • albo przez dodanie argumentu przy uruchamianiu programu: -Duser.language=en -Duser.country=US
  • albo przez dodanie linijki kodu na samym starcie:
public static void main(String[] args) {
   Locale.setDefault(Locale.ENGLISH);
   // I tutaj dalej co tam chcesz
}
0
wartek01 napisał(a):

Na 99% twój problem bierze się z ustawień lokalizacji - w języku polskim znakiem dziesiętnym jest przecinek, a nie kropka. Czyli masz do wyboru:

  1. Albo wpisywać liczby po polsku, tj. 1,2 zamiast 1.2
  2. Albo zmienić ustawienia lokalizacji.

I tutaj zaczyna się zabawa, bo masz dwie opcje: albo zmieniasz lokalizację w konkretnym miejscu:

Scanner in = new Scanner(System.in);
in.useLocale(Locale.ENGLISH); // czyli za każdym razem gdy będziesz tworzył nowy obiekt typu Scanner to będziesz musiał dodawać tę linijkę

"Za każdym razem", czyli pewnie raz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1