# BigDecimal falsch formatiert bei Locale.GERMANY



## Nimbus (26. Jun 2009)

Hallo,

bei der Formatierung eines BigDecimal gibt es ein Problem. Die Zahl kommt ursprünglich aus einer Datenbank, hat daher das Format wie unten (z.B. "3.14"). Ich habe sie per "getString"-Methode geholt, und sie genauso geparst wie den String unten. Sie soll in ein BigDecimal gemappt und entsprechend der Locale formatiert ausgegeben werden. Bei Locale.US z.B. funktioniert das auch, aber bei anderen nicht. Bei Locale.GERMANY habe ich die Ausgabe "314", bei Locale.FRANCE habe ich "3", etc.
Was mache ich falsch?

System: Ubuntu Linux 9.04, Sun Java SE 1.6.0_13-b03


```
// BDTest.java

import java.util.Locale;
import java.text.NumberFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParsePosition;
import java.math.BigDecimal;

public class BDTest {
  public static void main (String[] args) {
    DecimalFormat decfrm = (DecimalFormat)NumberFormat.getInstance(Locale.GERMANY);
    decfrm.setParseBigDecimal(true);
    //DecimalFormatSymbols dfs = new DecimalFormatSymbols (Locale.GERMANY);
    //decfrm.setDecimalFormatSymbols(dfs);
    ParsePosition pos = new ParsePosition(0);
    BigDecimal bd = (BigDecimal)decfrm.parse("3.14", pos);
    System.out.println ("BD: "+bd);
  }

}
```

Achja: mit dem oben auskommentierten Konstrukt (DecimalFormatSymbols) geht es genausowenig.

Für eure Hilfe schonmal vielen Dank!

Gruss,
Nimbus


----------



## SlaterB (26. Jun 2009)

die Zahl hat einen . statt Komma
nach deutschen Format ist es also 314, daher ist das Parsen zu 314 doch korrekt, was stört dich?

wenn du den . als Komma interpretieren willst, dann solltest du einen englisches Format verwenden, das erparst dir 3.14

danach, wenn du den BigDecimal hast, kannst du gerne überlegen, ihn per deutschen Formatter in den String "3,14" umzuwandeln,
das ist ein separater Schritt mit eigenem Formatter


----------



## Nimbus (26. Jun 2009)

Hallo SlaterB,

Vielen Dank, jetzt klappt es auch!

Ich habe festgestellt, dass die JTable beim Editieren von Zellen schon automatisch nur korrekte Formatierung z.B. von BigDecimal-Zahlen zulässt, wenn das TableModel den Datentyp BigDecimal in der entsprechenden Spalte besitzt. Ich hoffte das irgendwie nutzen zu können, dass man (z.B. für deutsche Nutzer) in der JTable die Zahlen mit Kommata anzeigt, und der Benutzer auch beim Editieren Kommata verwenden kann, bei englischen Nutzern aber z.B. das ganze wie gehabt mit Punkten sein soll, etc. (also dynamisch je nach Locale). Für ein Update der DB muss ich es ja dann wieder im englischen Format haben.
Muss ich mir hierfür einen TableCellEditor basteln, der beim Editieren das ganze rückwärts anwendet, oder geht das irgendwie anders?

Gerade etwas auf dem Schlauch stehend,
Nimbus


----------



## SlaterB (26. Jun 2009)

wenn die JTable BigDecimals in einem bestimmten Format anzeigt, dann kann sie sicherlich auch editierte Werte zurückumwandeln,
ob du aber für den Wechsel in ein anderes Format einen eigenen TableCellEditor brauchst, oder ob eh nach Landeseinstellung das korrekte Format gewählt wird,
kann ich nicht beantworten,

da müsste ich jetzt genausoviel basteln wie du und überlasse dir die Aufgabe selber 
(oder wer anders sagt noch was dazu oder du meintest die Frage anders)


----------

