2016-12-05 1 views
-1

ich habe diesen Code:Number nicht korrekt Nummer geben

import java.text.NumberFormat; 
import java.text.ParseException; 
import java.util.Locale; 
import java.util.Scanner; 


class EntryPoint { 
    static Locale czech = null; 

    static Locale getCzechLocale(){ 
     if (czech == null){ 
      czech = new Locale("cs","CZ"); 
     } 
     return czech; 
    } 

    public static void main(String[] args) { 
     Scanner sn = new Scanner(System.in); 
     NumberFormat nf = NumberFormat.getInstance(getCzechLocale()); 
     System.out.println(nf.format(12000.5)); 
     NumberFormat nf2 = NumberFormat.getCurrencyInstance(getCzechLocale()); 
     try { 
      String input = sn.nextLine(); 
      System.out.println(input); 
      Number n = nf.parse(input); 
      System.out.println(n.floatValue()); 
     }catch(ParseException javaTextParseException){ 
      System.err.println("Unable to parse input String"); 
     } 
    } 

} 

Ich mag diese Sache zu archivieren: wenn ich Nummer eingeben „12 000,5“ (als Programm angezeigt wird) Programm Parst und dieser String und wird Anzeige Nummer "12000.5". Was habe ich falsch? Nun, wenn ich „12 000,5“ ohne "Zeichen Programmanzeige float Zahl‚12,0‘, nicht‚12.000,5‘

Gelöst NumberFormat.Parse (String) endet am ersten Raum char eingeben, also wenn ich machen trim() und Ersetzen (““, ‚‘), dann führt OK ist

+0

Warum denken Sie, das ist falsch? – Henry

+0

Ich bin auf System mit "en_US" Gebietsschema, so muss ich Text eingeben in "cs_CZ" -Format und in "en_US" –

+0

@Henry, denn wenn ich "12 000,5" eingeben, habe ich Ergebnis "12.0" –

Antwort

1

NumberFormat stoppt nicht auf dem ersten Platz. Es ist nur so, dass das von NumberFormat verwendete Gruppierungstrennzeichen ein geschütztes Leerzeichen und kein reguläres Leerzeichen ist.

Wenn Sie die Ausgabe von Ihrem Programm kopieren und einfügen, um es als Eingabe zu übergeben, wird es glücklicherweise wieder zu 12000.5 parsen, da die Ausgabe ein geschütztes Leerzeichen verwendet.

Wenn Sie es einen regelmäßigen Leerzeichen verwenden möchten, verwenden Sie

DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance(new Locale("cs", "CZ")); 
DecimalFormatSymbols decimalFormatSymbols = nf.getDecimalFormatSymbols(); 
decimalFormatSymbols.setGroupingSeparator(' '); 
nf.setDecimalFormatSymbols(decimalFormatSymbols); 
-2

diesen Code versuchen, es für mich gearbeitet.

 Locale czech = new Locale("cs", "CZ"); 
     Scanner sn = new Scanner(System.in); 
     NumberFormat nf = NumberFormat.getInstance(czech); 
     String input = sn.nextLine(); 
     System.out.println(nf.format(Double.parseDouble(input))); 
     sn.close(); 
+0

nicht funktioniert für mich: /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -Dfile.encoding = UTF-8 -jar/Benutzer/jvalek/IdeaProjects/HelloWorld/out/Artefakte/HelloWorld_jar/HelloWorld .jar- 12 000,5 Exception in thread "main" java.lang.NumberFormatException: Für die Eingabe-Stichwort: "12 000,5" \t bei sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:2043) \t bei sun.misc.FloatingDecimal.parseDouble (FloatingDecimal.java:110) \t bei java.lang.Double.parseDouble (Double.java:538) \t bei EntryPoint.main (EntryPoint.java:22) Prozess beendet mit Exit-Code 1 –

+0

Sie müssen 12.000,5 nicht eingeben, Sie sollten nur 12000.5 eingeben und der obige Code wird den Rest erledigen. –

-2

Wenn Sie ein festes Format wie ## ###,# werden mit einem festen prüfen, mit Formatparser wie DecimalFormat:

NumberFormat nf = new DecimalFormat("### ###.##"); 
Number n=nf.parse("123 456,78"); 
Verwandte Themen