2013-09-25 2 views
2

Если я выполнить следующий код:Странное поведение Scanner.nextFloat

import java.util.Scanner; 

public class ScannerTest { 

    public static void main(String[] args) { 

     Scanner s = null; 
     StringBuilder builder = new StringBuilder(64); 
     String line = "1.1 2.2 3.3"; 
     float fsum = 0.0f;  

     s = new Scanner(line).useDelimiter(" "); 

     while (s.hasNextFloat()){ 
      float f = s.nextFloat(); 
      fsum += f; 
      builder.append(f).append(" "); 
     } 
     System.out.println("Floats found: " + builder); 
     System.out.println("Sum: " + fsum); 
     s.close(); 
    } 
} 

Мой вывод:

Floats found: 
Sum: 0.0 

Но если заменить точки на запятые в строке "1,1 2,2 3,3", то он признает поплавки:

Floats found: 1.1 2.2 3.3 
Sum: 6.6000004 

Я думаю, это потому, что мой СО на испанском языке, и мы используем запятые вместо d ots с десятичными числами. Я думал об использовании Locale, но не существует Locale.SPANISH.

Кроме того, она ведет себя как раз наоборот, когда я запускаю это:

public class StringToFloatTest { 

    public static void main(String[] args) { 
     String st = "1,1"; 
     float f = Float.parseFloat(st); 
     System.out.println(f); 
    } 
} 

результатов Этого кода в NumberFormatException, но это работает, если я использую String st = "1.1".

Может кто-нибудь объяснить, почему это происходит, и как я могу заставить сканер распознать поплавки с точками?

+2

Принимала вы посмотрите на этот пост? Похоже, что это связано с Locale вашей системы (как вы догадались): http://stackoverflow.com/questions/4708219/weird-behaviour-with-scannernextfloat?rq=1 – Julien

ответ

5

Может кто-нибудь объяснить, почему это происходит

Как вы сказали, он использует локаль по умолчанию. Распечатайте Locale.getDefault(), чтобы узнать, какова ваша локаль по умолчанию.

Отметьте, что Float.parseFloat is не местный.

и как я могу заставить сканер распознать поплавки с точками?

Вызов s.useLocale(Locale.US);

Смежные вопросы