# String 1.000,00 in double umwandeln



## H2SO3- (3. Aug 2011)

hi,

ich muss strings in double umwandeln. Es kann aber sein das die nicht dem englischen standard entsprechen. Also 10,000.00 sondern zb. auch 10.000,00. Gibt es eine möglichkeit dies ebenfalls zu parsen? Vielleicht mit einer class wo ich den tausender und den decimal trenner mit angeben?


----------



## Volvagia (3. Aug 2011)

Schau dir mal DecimalFormat#parse an.


----------



## SlaterB (3. Aug 2011)

DecimalFormat mit Locale


----------



## turtle (3. Aug 2011)

```
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
    	  Double myNumber =   (Double) nf.parse("12,345.67");
    	  System.out.println("Deutsch:"+myNumber);
     	 nf = NumberFormat.getInstance(Locale.ENGLISH);
   	  myNumber =   (Double) nf.parse("12,345.67");
   	  System.out.println("Englisch:"+myNumber);
```
Deutsch:12.345
Englisch:12345.67


----------



## H2SO3- (3. Aug 2011)

danke erstmal für eure schnellen antworten. Hatte gehofft ich schaffe es ohne local.
zum einem bekomme ich die strings aus csv dateien und weiß nicht woher die kommen.
Was ich habe ist der decimaltrenner und wenn vorhanden der tausendertrenner.

Hatte gehofft sowas hier würde funktionieren


```
DecimalFormat nf1 = (DecimalFormat)NumberFormat.getInstance(Locale.GERMAN);
// land ist mit egal, brauch ich nur um eine instance zu bekommen
		      nf1.applyPattern("#.###,###");
	          Double myNumber =   (Double) nf1.parse("12.345,67");
	          System.out.println("Kein Land:"+myNumber);
	          nf1.applyPattern("#,###.###");
	          myNumber =   (Double) nf1.parse("12,345.67");
	          System.out.println("Kein Land:"+myNumber);
```

leider funktioniert dies so nicht.
Zudem habe ich das problem das es theoretisch sein könnte das auch was anderes als separator kommt als . oder ,
 zb könnte etwas so aussehen 10T000D00
Das bekomme ich mit einfachen locales nicht hin, da brauche ich entsprechende pattern


----------



## SlaterB (3. Aug 2011)

bloß nicht bei DecimalFormat vorbeischauen was so alles möglich ist..

```
public class Test {
    public static void main(String[] args) throws Exception  {
        DecimalFormat df = new DecimalFormat();
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setDecimalSeparator('D');
        dfs.setGroupingSeparator('T');
        df.setDecimalFormatSymbols(dfs);
        System.out.println(df.parse("10T000D01"));
    }
}
```


----------



## H2SO3- (3. Aug 2011)

das scheint so ziemlich das zu sein was ich gesucht habe 
Ist zwar nicht perfekt aber sollte reichen.

Bei einer kleinen Änderung (wo ich eine exception erwartet hätte) wird leider auch eine zahl nähmlich 10 ausgegeben


```
DecimalFormat df = new DecimalFormat();
	        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
	        dfs.setDecimalSeparator('.');
	        dfs.setGroupingSeparator(',');
	        df.setDecimalFormatSymbols(dfs);
	        System.out.println(df.parse("10.000,000.01"));
```

oder kann man ihm irgendwie sagen das es härter in der beurteilung des strings sein soll??


----------



## H2SO3- (3. Aug 2011)

merke gerade das die methode ja überhaupt nicht im sicherheren bereich arbeitet.
Bei folgendem Code kommt 1000 raus als das ein exception geworfen wird


```
DecimalFormat df = new DecimalFormat();
	        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
	        dfs.setDecimalSeparator('l');
	        dfs.setGroupingSeparator(',');
	        df.setDecimalFormatSymbols(dfs);
	        System.out.println(df.parse("1,000.01"));
```

muss wohl doch noch was anderes suchen.
Hat noch jemand eine idee?


----------



## SlaterB (3. Aug 2011)

sowas hier gibts, noch, wenn auch relativ umständlich:

```
public class Test {
    public static void main(String[] args)  throws Exception {
        DecimalFormat df = new DecimalFormat();
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setDecimalSeparator('l');
        dfs.setGroupingSeparator(',');
        df.setDecimalFormatSymbols(dfs);
        ParsePosition p = new ParsePosition(0);
        String st = "1,000l01";
        System.out.println(df.parse(st, p));
        if (p.getIndex() != st.length()) System.out.println("Ärger");
    }
}
```


----------



## H2SO3- (3. Aug 2011)

na das sieht doch ganz gut aus  DANKE
werde mal noch einige tests durchführen aber das könnte es sein. Durchaus etwas umständlich da hast du recht aber nicht weiter tragisch da der code gut versteckt weit unter der API ist


----------



## H2SO3- (4. Aug 2011)

ich weiß ich nerve und bin pendantisch aber naja *gg*

folgendes. Der code funktioniert soweit ziemlich gut. Was mir noch aufgefallen ist, ist folgendes


```
DecimalFormat df = new DecimalFormat();
	        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
	        dfs.setDecimalSeparator(',');
	        dfs.setGroupingSeparator('.');
	        df.setDecimalFormatSymbols(dfs);
	        ParsePosition p = new ParsePosition(0);
	        String st = "1.0500,01";
	        System.out.println(df.parse(st, p));
	        if (p.getIndex() != st.length()) System.out.println("Ärger");
```

wie man sieht stehen zwischen dem "." (tausender trenner) und dem "," 4 zeichen. Ansich dürfen es natürlich eigentlich nur 3 sein. Der code gibt mir jedoch als double 10500.01 aus. Hatte gehoft, das er so streng ist, das er meckert. Scheint doch so zu sein, das er den tausender trenner "nur" löscht.
Gibt es was womit sowas abgefangen werden kann?
Die bis jetzt benannten classen können dies wohl alle nicht.


----------



## H2SO3- (5. Aug 2011)

Ich kann dem DecimalFormat ja im constructor ein pattern mitgeben. Müsste ich darüber nicht das problem mit den falschen doubles lösen lönnen?

Also:
1.000,7 OK
1.000.000,8 OK
1.0003.0 FALSE da vier ziffern

bekomme nur leider ein entsprechendes pattern nicht hin. Gibt es hier leute die fit in sowas sind?


----------



## bERt0r (5. Aug 2011)

Wenn du da so heikel sein musst, würde ich an deiner stelle das Parsen auf diese art machen, und dann mit Pattern+Matcher nochmal validieren, der sollte nämlich genauer sein.


----------

