Следующий код делает именно то, что ожидается:
import java.math.BigDecimal;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
BigDecimal number = new BigDecimal("0");
System.out.print("Enter a number: ");
try {
number = new BigDecimal(input.next());
}
catch(Exception e) {
System.out.println("Not a number.");
}
System.out.println(number);
}
}
- Правильно: сбой при вводе строки.
- Правильно: если я наберу 1,1, произойдет сбой.
- Правильно: Успешно, если я наберу 1.
- Исправить: Успешно, если я наберу 1.1
Если я удаляю блок try catch и заменяю его циклом while, как показано ниже, он не делает то, что ожидается:
import java.math.BigDecimal;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter a number: ");
while (!input.hasNextBigDecimal()) {
System.out.print("Not a number, try again: ");
input.next();
}
BigDecimal number = input.nextBigDecimal();
System.out.println(number);
}
}
- Правильно: сбой при вводе строки.
- Не правильно: если я наберу 1.1, произойдет сбой.
- Правильно: Успешно, если я наберу 1.
- Неправильно: Успешно, если я наберу 1,1
Вот вывод при запуске: java Test
C:\>java Test
Enter a number: 1,1
1.1
Почему он принимает запятую, но печатает точку?
Если я запускаю следующий код, он печатает: en_ZA
import java.util.Locale;
public class Test3 {
public static void main(String[] args) {
System.out.println(Locale.getDefault());
}
}
Как вы можете видеть по следующей ссылке, десятичный разделитель для моей локали - это период:
http://www.localeplanet.com/java/en-ZA/index.html
Пожалуйста, сообщите, где я иду не так.
Edit:
При дальнейшем расследовании я обнаружил следующее:
https://www.sadev.co.za/content/how-correctly-format-currency-south-africa
Так что технически локаль использует запятую. Унесенные разумом:)