2014-10-08 5 views
12

Ich habe versucht, einen String (14 123) auf eine lange in Java mit schwedischen locale mit diesem Code zu analysieren:Parse String Long eine angegebene locale mit (sv) und Number

String longString = "14 123" 
NumberFormat swedishNumberFormat = NumberFormat.getInstance(new Locale("sv")); 
System.out.println(swedishNumberFormat.parse(longString).longValue()); 

Der Ausgang dieses Codes ist 14 (es sollte 14123 sein). Gemäss this question habe ich sowohl mit dem sv als auch mit sv_SE locale versucht, aber dieses Mal war das Ergebnis in beiden Fällen identisch.

Nach http://www.localeplanet.com/java/sv/index.html und http://www.localeplanet.com/java/sv-SE/index.html der Gruppierung Separator in beiden Fällen ist ein Raum () so warum die Zeichenfolge zu lange Parsing eine nicht verarbeiten, für das Gebietsschema, richtig formatierte doppelte Wert als String gespeichert?

+0

Also ein Fehler in der schwedischen Gebietsschema in Java? –

+3

Für mich ist diese Frage und Antwort besser als eine, die als verwandt gekennzeichnet ist. Ich denke nicht, dass diese Frage geschlossen werden sollte. – Jayan

Antwort

12

Schwedisch, wie Französisch auch, braucht einen harten. schadloser Raum.

longString = longString.replace(' ', '\u00a0'); 

Umständlich.

+0

jetzt bekomme ich es :) – GameDroids

+1

@GameDroids ja durchaus eine völlig irreführende Design-Entscheidung, einen nicht-brechenden Raum als Gruppierungstrennzeichen zu verwenden. Vielleicht wollten sie Wortbrüche bei 'Format'-generierten Zahlen verhindern. –

0

Könnten Sie versuchen

diese Zeichenfolge Parse mit manuell DecimalFormat einrichten. Konstruieren Sie es, konfigurieren Sie setGroupingUsed (true), setDecimalSymbols mit Ihrem eigenen DecimalFormatSymbols.

Die zweite Option ist das Debuggen Ihres Codes siehe swedishNumberFormat-Instanz, die Sie haben. Überprüfen Sie die Felder groupingSize, decimalFormatSymbols.groupingSeparators.

0

Wie in this post zu sehen, müssen Sie Whitespace manuell als Trennzeichen festlegen.

try { 
     String longString = "14 123";    
     DecimalFormat decimalFormat = new DecimalFormat(); // instead of NumberFormat, use DecimalFormat 
     DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("sv", "SE")); 
     symbols.setGroupingSeparator(' '); // set the whitespace manually as grouping seperator 
     decimalFormat.setDecimalFormatSymbols(symbols);   
     System.out.println(svSE.parse(longString)); 
    } catch (ParseException ex) { 
     Logger.getLogger(Playground.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    //> output is 14123 

um ehrlich zu sein ich bin ein wenig verwirrt, aber ich denke, die Ausgabe ist, dass Sie formated Strings benötigen (anscheinend nicht jeder Leerzeichen hier das gleiche ist)

try { 
     long testNumber = 123987l; 
     NumberFormat swedishNumberFormat = NumberFormat.getInstance(new Locale("sv")); 

     //here I format the number into a String 
     String formatedString = swedishNumberFormat.format(testNumber); 
     System.out.println(formatedString); // result: "123 987" 

     // when parsing the formated String back into a number 
     System.out.println(swedishNumberFormat.parse(formatedString)); // result: "123987" 

     // but when parsing a non formated string like this one 
     System.out.println(swedishNumberFormat.parse("123 987")); // result "123" 
} catch (ParseException ex) { 
     Logger.getLogger(Playground.class.getName()).log(Level.SEVERE, null, ex); 
} 

Bitte korrigiere mich, wenn ich hier falsch liege oder mein Beispiel nicht funktioniert hat. Ich habe keine Idee, warum es die Dinge so macht, aber um Situationen wie die oben genannten zu verwirren, möchten Sie vielleicht das Trennzeichen manuell einstellen.

EDIT

als Joop Eggen in seinem answer erklärten der String einen harten, nicht-breaking Speicherplatz verwenden muss ('\u00a0') anstelle einem einfachen Leerzeichen. Das ist der Grund, warum mein Beispiel in der letzten Zeile "123" zurückgibt (ich habe nur den normalen Leerraum benutzt).